#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) прошла успешно, большое вам спасибо!