Разница CMake между include_directories и add_subdirectory?
Я изучаю CMake для создания кода на С++ и борюсь со следующей концепцией. На моем корневом уровне у меня есть некоторые файлы cpp и CMakeLists.txt, которые успешно генерируют некоторый бережливый код в каталоге gen-cpp. Мой корневой уровень CMakeLists.txt содержит:
include_directories ( "путь к корню" /ген-CPP). (наряду с автоматическим генератором и включает в себя.
Все компилируется нормально, но я получаю связанные с динамической библиотекой ошибки времени выполнения для символа undefined, ссылающегося на класс, определенный в каталоге gen-cpp. Когда я перемещаю файлы в каталоге на корневой уровень, он работает нормально. что мне не хватает? (Я также скорректировал #include в корневом уровне cpp directorie s, чтобы указать на "путь к корню" /gen -cpp).
Это непонимание использования include_directory, где я должен использовать add_subdirectory. Если последний, будет ли код в gen-cpp нужен собственный CMakeLists.txt? Почему этот дополнительный файл не нужен, когда содержимое указанного каталога является корневым уровнем?
Ответы
Ответ 1
include_directories()
используется для добавления путей поиска заголовков (-I
flag) и add_subdirectory()
не будет иметь никакого значения в этом случае.
Я полагаю, вам нужно перечислить *.cpp файлы из папки gen-cpp в вызовах add_executable()
или add_library()
, в которых вы хотите, чтобы эти символы были.
В качестве альтернативы вы можете скомпилировать все источники бережливости в библиотеку и связать ее с вашим кодом.
Ответ 2
add_subdirectory (source_dir) используется для добавления подкаталога в сборку. В каталоге source_dir также есть файл CMakeLists.txt. Этот файл CMakeLists.txt в указанном исходном каталоге будет немедленно обработан CMake перед продолжением обработки в текущем входном файле после этой команды.
include_directories (dir): добавить указанные каталоги к тем, которые компилятор использует для поиска включаемых файлов. Эти каталоги добавляются в свойство каталога INCLUDE_DIRECTORIES для текущего файла CMakeLists.