Я получаю multiple definition
ошибки ссылки после условной компиляции кода для платформы.
Мой проект выложен так:
/
|__+ include/
| |__+ native/
| | |__ impl.h
| |
| |__ general.h
|
|__+ src/
|__+ native/
| |__ impl.linux.c
| |__ impl.win32.c
|
|__ general.c
Вверху файла general.c
:
#if defined(LIBRARY_PLATFORM_LINUX)
#include "native/impl.linux.c"
#elsif defined(LIBRARY_PLATFORM_WIN32)
#include "native/impl.win32.c"
#endif
Я настроил интроспекцию в CMake для определения операционной системы и определения соответствующих констант. Дело в том, что я не хотел поддерживать один CMakeLists.txt
файл в каждом каталоге, поэтому я просто скопировал все .c
файлы , как предложено в этом ответе :
file(GLOB_RECURSE LIBRARY_SOURCE_FILES "${PROJECT_SOURCE_DIR}/src/*.c")
Видимо, именно это и является причиной проблемы. Кажется, он компилирует код #include
d в general.c
, а также отдельные src/native/impl.*.c
файлы.
CMakeFiles/lib.dir/src/native/impl.linux.c.o: In function `declared_in_impl_h':
impl.linux.c:(.text+0x0): multiple definition of `declared_in_impl_h'
CMakeFiles/lib.dir/src/general.c.o:general.c:(.text+0x0): first defined here
Как я могу распутать эту ситуацию?