Почему проект не распознает функцию main?

Здравствуйте! Я пытаюсь перенести функцию main в свою библиотеку, следуя инструкции из данного видео: <a href="https://youtu.be/meARMOmTLgE" rel="nofollow">https://youtu.be/meARMOmTLgE</a>. Однако при попытке построить приложение я сталкиваюсь с ошибкой линковщика: <b>unresolved external symbol main referenced in function "ind __cdecl __scrt_common_main_seh(void)"</b>. 

Вот код, который я включил в свою библиотеку: 
<pre><code class="cpp">#pragma once

#ifdef TEST
	#define TEST_API __declspec(dllexport)
#else
	#define TEST_API __declspec(dllimport)
#endif

#include &lt;iostream&gt;

#ifdef TEST
int main(int argc, char** argv) {
	std::cout &lt;&lt; "Complete";
	return 0;
}
#endif</code></pre> 

В проекте приложения нет никакого кода, кроме инклуда заголовка с приведённым выше кодом. Что я делаю не так?
  • 27 сентября 2024 г. 1:23
Ответы на вопрос 2
Ошибка, с которой вы столкнулись, связана с тем, что ваш проект, скорее всего, настроен как приложение (например, Windows Application или Console Application), но при этом linker не может найти точку входа (функцию `main`), так как она находится в заголовочном файле библиотеки и защищена условной компиляцией.

Давайте разберемся подробнее:

1. **Условия компиляции**: В вашем коде функция `main` определена только если определён символ `TEST`. Если вы не определили этот символ при сборке вашего проекта, компилятор не увидит определение функции `main`, что и приводит к ошибке линковщика. Убедитесь, что символ `TEST` определён при сборке вашего приложения.

2. **Неправильная организация проекта**: Если вы хотите, чтобы функция `main` находилась в библиотеке, убедитесь, что ваш проект библиотеки предоставляет эту функцию. Однако обычно `main` функция определяется в основном приложении, а не в библиотеке, так как библиотеки предназначены для предоставления функций, которые могут быть вызваны из основного приложения.

3. **Способы решения**:
   - **Добавить определение `TEST`**: Если вы собираете библиотеку и хотите включить `main` в неё, убедитесь, что в настройках вашего проекта (например, в параметрах компилятора) определён символ `TEST`. В Visual Studio это можно сделать в настройках проекта (C/C++ -> Предопределенные макросы).
   - **Определение `main` в приложении**: Если вы хотите, чтобы ваше приложение имело свою собственную функцию `main`, рекомендую перенести `main` из библиотеки в ваше приложение и вызывать необходимые функции из библиотеки.

Пример того, как может выглядеть ваш основной файл приложения:

```cpp
#include "your_library_header.h" // Замените на имя вашего заголовка

int main(int argc, char** argv) {
    // Здесь вы можете вызвать функции из вашей библиотеки
    std::cout << "Hello, World!" << std::endl;
    return 0;
}
```

Таким образом, учитывая архитектуру вашего приложения и библиотеки, вы сможете избежать ошибки линковщика при наличии функции `main`.
Нашёл причину ошибки, спасибо orfelin 
У меня была shared библиотека, а не static
Похожие вопросы