#c #cmake
#c #cmake
Вопрос:
Я пытаюсь включить этот проект в свою базу кода cmake. Я клонировал репозиторий в свой include / dir и добавил эту строку в свои CMakeLists.txtx:
add_subdirectory(${DIVISIBLE_INSTALL_INCLUDE_DIR}/cc.ublox.commsdsl)
include_directories(${DIVISIBLE_INSTALL_INCLUDE_DIR})
link_directories(${DIVISIBLE_INSTALL_INCLUDE_DIR})
Но когда я пытаюсь перестроить свой проект, он говорит, что не может найти определенные файлы схемы:
[WARNING]: failed to load external entity "/Users/pete/Documents/projekte/simple-dgps/dsl/main.xml"
Если я добавлю префикс проекта (PROJECT_SOURCE_DIR) к пути к файлам схемы, путь появится дважды.
ERROR: Failed to parse/Users/pete/Documents/projekte/simple-dgps/Users/pete/Documents/projekte/simple-dgps/include/cc.ublox.commsdsl/dsl/main.xml
И если я заполню недостающую часть между simple-dgps и dsl (что было бы include/cc.ublox.commsdsl
), я получу эту ошибку:
make[2]: *** No rule to make target `include/cc.ublox.commsdsl/include/cc.ublox.commsdsl/dsl/main.xml', needed by `output.tmp'. Stop.
make[1]: *** [include/cc.ublox.commsdsl/CMakeFiles/cc.ublox.commsdsl.dir/all] Error 2
make: *** [all] Error 2
Предполагая, что первая ошибка связана с неправильным расположением файла, что тогда означает вторая (хотя у нее явно неправильный путь, потому что она существует дважды)
Комментарии:
1. Этот
CMakeLists.txt
проект написан для запуска как автономный, а не для включения черезadd_subdirectory
. Вы можете сказать, потому что он используетCMAKE_SOURCE_DIR
повсюду, где вы не размещаете проект, эта переменная указывает на ваш проект. Это можно исправить, используя что-то вроде<PROJECT-NAME>_SOURCE_DIR
вместо этого, потому что определен новый проект. Это не будет прямолинейно, вам нужно изменить cc.ublox.commsdslCMakeLists.txt
. Может быть проще рассматривать его как внешний проект вместо этого.2. Я сделал это, но путь по-прежнему вводится дважды
Ответ №1:
Проблема, безусловно, заключается в определении пути проекта для cc.ublox.commsdsl
по сравнению с путем проекта для вашего проекта.
Если я добавлю префикс проекта (PROJECT_SOURCE_DIR) к пути к файлам схемы, путь появится дважды.
Можете ли вы поделиться тем, что вы добавили? /Users/pete/Documents/projekte/simple-dgps/include/cc.ublox.commsdsl/dsl/main.xml
выглядит правильно для cc.ublox.commsdsl
пути — но, похоже, вы, возможно, добавили путь таким образом, что он дублируется. Трудно сказать, что не так, не глядя на то, что вы добавили.
Комментарии:
1. Я изменил его на это:
set (schema_files ${CMAKE_SOURCE_DIR}/dsl/main.xml
2. Ах, так, может быть,
${CMAKE_SOURCE_DIR}
в этом и заключается дублирование. ГдеCMAKE_SOURCE_DIR
определено?3.
CMAKE_SOURCE_DIR
являетсяThe path to the top level of the source tree.
и определяетсяCMake
при запускеCMake
в командной строке.4. И почему тогда он дважды вставляется в мой path? (спасибо за rply)
5. Из-за внесенных вами изменений; но это трудно определить, потому что вы не показали нам, что именно вы изменили.
Ответ №2:
Найдена проблема с проблемой двойного пути. Я добавил проект в качестве subdir из моего основного проекта, добавив эту строку:
add_subdirectory(${DIVISIBLE_INSTALL_INCLUDE_DIR}/cc.ublox.commsdsl)
Проблема в том, что DIVISIBLE_INSTALL_INCLUDE_DIR является абсолютным путем и, следовательно, добавляется в каталог исходного кода cmake вложенного каталога.
Это может быть исправлено с помощью:
add_subdirectory(include/cc.ublox.commsdsl)
Комментарии:
1. Пожалуйста, покажите, какая переменная
CMake
устанавливается неправильно при использовании абсолютного пути сadd_subdirectory()
. Простое тестирование показывает, чтоCMAKE_SOURCE_DIR
иPROJECT_SOURCE_DIR
иCMAKE_CURRENT_SOURCE_DIR
все показывают правильный абсолютный путь.