Связывание библиотек не работает при создании одной сборки CMake

#cmake

#cmake

Вопрос:

используя CMake, я хочу создавать в каждом каталоге A, B и C.

Структура проекта выглядит следующим образом:

 . ├── A │   ├── CMakeLists.txt │   └── src │   └── a.cpp ├── B │   ├── CMakeLists.txt │   └── src │   └── b.cpp ├── common │   ├── CMakeLists.txt │   ├── include │   │   ├── common.h │   └── src │   └── common.cpp └── C  ├── CMakeLists.txt  └── src  └── c.cpp  

Создайте библиотеку в общем каталоге и установите созданную библиотеку.

common/CmakeLists.txt :

 set(COMMON_LIB_NAME CommonTemp) set(SRC_CODE ${CMAKE_CURRENT_SOURCE_DIR}/include/common.h  ${CMAKE_CURRENT_SOURCE_DIR}/src/common.cpp )  add_library (${COMMON_LIB_NAME} SHARED ${SRC_CODE})  install(TARGETS ${COMMON_LIB_NAME} DESTINATION ~/tempDir/lib)  

Я хочу связать созданную библиотеку с каталогом A. a.cpp требуется общее.ч.

A/CMakeLists.txt:

 ADD_EXECUTABLE(ServiceA src/a.cpp)  target_include_directories (  ServiceA PUBLIC  include )  target_sources (  ServiceA PRIVATE  src/a.cpp )  target_link_libraries(  ServiceA PUBLIC  ${COMMON_LIB_NAME} #### Location considered to be a problem )  install(TARGETS ServiceA DESTINATION ~/tempDir/bin/A)  

Появляется сообщение об ошибке, в котором говорится, что common.h не может быть включен.

Я предполагаю, что переменная ${COMMON_LIB_NAME} определена в CMakeLists.txt в другом каталоге, поэтому ожидается, что он не может быть связан. Но даже если я поставлю CommonTemp , значение переменной, это говорит о том, что common.h не может быть найден.

Как я могу связать ссылки на библиотеки, даже если я создаю CMake индивидуально в каждом каталоге?

Ответ №1:

В common/CmakeLists.txt.

Вам нужно включить заголовки в target_include_directores .

 target_include_directories(  ${COMMON_LIB_NAME} PUBLIC  ${CMAKE_CURRENT_SOURCE_DIR}/include  )  

Нет необходимости упоминать об этом в add_library

В A/CMakeLists.txt. Включить путь неверно.

 target_include_directories(  ServiceA PUBLIC  ${CMAKE_CURRENT_SOURCE_DIR}/lt;path to commongt;/include )  

Для связывания библиотеки вы должны указать правильный путь к библиотеке, иначе это приведет к сбою

 target_link_libraries(  ServiceA PUBLIC  ${COMMON_LIB_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/lt;path to tempDirgt;/lib )  

Комментарии:

1. Не указывайте абсолютные пути к библиотеке во временном каталоге в домашней папке пользователя в CMakeLists.txt где угодно, но особенно не здесь target_link_libraries .

2. Спасибо. Ваш комментарий был намеком. Проблема была решена путем включения содержимого, включенного в target_include_directories в Common/CMakeLists.txt в A/CMakeLists.txt -тоже. Кроме того, путь к общей библиотеке задан в каталогах target_link, и ссылка target_link_libraries (ОБЩЕДОСТУПНАЯ служба-lCommonTemp) прошла успешно, большое вам спасибо!