У меня есть файл 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 менять нельзя, всё остальное можно.
Ну сделать, например, файл foo_wrapper.cpp:
#include <foo.hpp>
#define main this_is_not_main
#include "foo.cpp"
Каждую из функций main обернуть в #if, например:
#if FOO_IS_MAIN
int main()
{
...
}
#endif
А при компиляции указывать соответствующую константу.