2 функции int main()

100
24 сентября 2021, 18:50

У меня есть файл foo.cpp, который содержит определения некоторых функций и функцию int main(). Этот файл является отдельным таргетом и может быть запущен (add_executable(foo foo.cpp)).

Ещё у меня есть файл bar.cpp, который включает в себя файл foo.hpp (содержащий объявления некоторых функций из foo.cpp), но также содержит другой int main().

Задача состоит в том, чтобы иметь возможность сделать таргет для bar.cpp, но для этого к объявлениям из foo.hpp надо прилинковать определения из файла foo.cpp. Однако при линковке возникает ошибка из-за двух функций int main(). То же самое, если сделать из foo.cpp библиотеку и прилинковать к таргету bar.

Как можно решить эту проблему? Можно ли как-то прилинковать foo к bar без функции int main() из foo.cpp? Или выбрать из двух функций единственную, чтобы не было ошибки?

Файлы:

foo.cpp

foo.hpp

bar.cpp

CMake:

add_executable(foo foo.cpp)
add_executable(bar bar.cpp)
add_library(foo_lib foo.cpp foo.hpp)
target_link_libraries(bar foo_lib) # Ошибка линковки: 2 функции int main()

Важно: файл foo.cpp менять нельзя, всё остальное можно.

Answer 1

Ну сделать, например, файл foo_wrapper.cpp:

#include <foo.hpp>
#define main this_is_not_main
#include "foo.cpp"
Answer 2

Каждую из функций main обернуть в #if, например:

#if FOO_IS_MAIN
  int main()
  {
    ...
  }
#endif

А при компиляции указывать соответствующую константу.

READ ALSO
Односвязный список рекурсивно

Односвязный список рекурсивно

Создаю односвязный список с добавлением элемента рекурсивноРазобралась с функциями ввода/вывода рекурсивно и создала функцию добавления...

204
WinApi ReadFileEx &amp; COMPLETION_ROUTINE

WinApi ReadFileEx & COMPLETION_ROUTINE

Помогите разобраться, не могу понять почему ядро вызывает COMPLETION_ROUTINE не дожидаясь новых данных в сокете?

94
define для нескольких слов

define для нескольких слов

Можно ли с помощью директивы #define заменить не одно слово на другое, а сразу кусок текста на другой кусок?

164
C++, идиома Opaque Pointer и паттерн Стратегия

C++, идиома Opaque Pointer и паттерн Стратегия

Подскажите, пожалуйста, возможно ли в C++ следующее:

91