Не удалось связать статическую зависимость / библиотеку после ее разрешения с помощью модуля CMake FetchContent - PullRequest
0 голосов
/ 23 сентября 2019

Ниже кусок кода не работает.Я хочу разрешить зависимость, называемую зависимостью1, используя FetchContent, которая представляет собой статическую библиотеку и ссылку на мой целевой исполняемый файл.Обратите внимание, что статическая зависимость - это проект CMake, который находится в svn.

Примечание. FetchContent успешно выполняет извлечение svn в SOURCE_DIR во время компиляции, но выдает ошибку, когда я пытаюсь связать исполняемый файл со следующей ошибкой вline target_link_libraries(App1, dependency1):

Cannot specify link libraries for target "App1," which is not built by this  project.

Я был бы очень признателен за любую помощь в этом.

My CMakeLists.txt :

cmake_minimum_required(VERSION 3.12 FATAL_ERROR)

project(App1)

include(FetchContent)

message("fetching dependency1")
FetchContent_Declare(
  dependency1
  SVN_REPOSITORY http://............/Dependency1
)

FetchContent_GetProperties(dependency1)

if(NOT dependency1_POPULATED)
  FetchContent_Populate(dependency1)
  add_subdirectory(${dependency1_SOURCE_DIR} ${dependency1_BINARY_DIR})
endif()

add_executable (App1 "App1.cpp" "App1.h")

link_directories(${dependency1_BINARY_DIR})

target_link_libraries(App1 dependency1)

СпасибоЦывареву вышеуказанный вопрос решен.Была дополнительная запятая, которую я неправильно использовал в targer_link_libraries.

Но теперь, когда я пытаюсь собрать ее, она не может найти статическую библиотеку, то есть "libDependency1.a"

Scanning dependencies of target App1
[ 25%] Building CXX object App1/CMakeFiles/App1.dir/App1.cpp.o
[ 50%] Linking CXX executable App1
/usr/bin/ld: cannot find -ldependency1
collect2: ld returned 1 exit status
make[2]: *** [App1/App1] Error 1
make[1]: *** [App1/CMakeFiles/App1.dir/all] Error 2
make: *** [all] Error 2

Я добавил link_directories ($ {dependency1_BINARY_DIR}), но все-таки не сделалне могу решить проблему.

Я каким-то образом могу решить проблему, но не могу полностью понять, как все это работает.

Проблема будет решена, если я использую Dependency1 вместо dependency1 в target_link_libraries.

target_link_libraries(App1 dependency1) --- Does not work
 target_link_libraries(App1 dependency1)  --- Works

В объявлении FetchContent я передал имя как "dependency1", поскольку я помню, что "Dependency1" не работал ранее.Обратите внимание, что имя моей зависимости - Dependency1 (с большой буквы).В target_link_libraries я думал, что это должно взять имя, которое я передал объявлению FetchContent, но это очень странно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...