Получение ошибок ссылок с CMake - PullRequest
1 голос
/ 18 марта 2012

Я получаю 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

Как я могу распутать эту ситуацию?

1 Ответ

2 голосов
/ 18 марта 2012

Лучшей практикой для такого рода кроссплатформенной ситуации является создание двух библиотек, одной для linux и одной для windows, и прекратить выполнять условные включения. Каждая платформа только компилирует и связывает соответствующую библиотеку.

Рекомендованный способ сделать это с помощью cmake - перестать использовать глобализацию и просто включить каждый файл. Есть некоторые ситуации, когда он может запутаться и не понять, что его нужно перекомпилировать. Вы можете аргументировать, что у неизменяемого устаревшего кода такой проблемы не будет.

Если вы действительно хотите избежать этих действий, я бы поместил включенный код в заголовок вместо файла c. Вы на самом деле не хотите включать защиту, чтобы люди не запутались из-за чего-то, что должно использоваться как обычный заголовок. Поместите кучу комментариев в файл, чтобы предупредить их об упомянутом поведении.

...