У меня есть файл 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
А при компиляции указывать соответствующую константу.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Создаю односвязный список с добавлением элемента рекурсивноРазобралась с функциями ввода/вывода рекурсивно и создала функцию добавления...
Помогите разобраться, не могу понять почему ядро вызывает COMPLETION_ROUTINE не дожидаясь новых данных в сокете?
Можно ли с помощью директивы #define заменить не одно слово на другое, а сразу кусок текста на другой кусок?
Подскажите, пожалуйста, возможно ли в C++ следующее: