В Ubuntu я загрузил стороннюю общую библиотеку (liba1.so), размещенную в /lib/extern/lib. Связанные файлы заголовков я поместил в /lib/extern/include. Мои собственные заголовочные файлы размещены в /include/public/ и /include/private/. И теперь (чтобы протестировать mylib) я хочу связать это с моим кодом main.cpp, используя CMake.
Моя структура:
**My structure:**
|
|
+---CMakeLists.txt
|
+---lib
| |
| +---extern
| |
| +---lib
| | |
| | +---liba.so
| | +---libb.so
| | +---liba12.so
| |
| +---include
| |
| +...headers.h
|
+---include
| |
| +---public
| | |
| | +---file1.hpp
| | +...
| |
| +---private
| |
| +---file2.hpp
| +...
|
+---src
|
+---public
| |
| +---file1.cpp
| +...
|
+---private
| |
| +---file2.cpp
| +...
|
+---main.cpp
Мой CMakeLists.txt:
cmake_minimum_required(VERSION 3.9...3.19)
if (${CMAKE_VERSION} VERSION_LESS 3.12)
cmake_policy(VERSION ${CMAKE_VERSION})
endif ()
project(mylib VERSION 0.0.1 DESCRIPTION "Test" LANGUAGES CXX )
set(CMAKE_CXX_FLAGS "${CMAKE_C_FLAGS} -DTPM_POSIX")
set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
add_library(${PROJECT_NAME} STATIC src/private/file2.cpp src/public/file1.cpp )
add_library(lib SHARED IMPORTED)
set_target_properties(lib PROPERTIES IMPORTED_LOCATION ${CMAKE_CURRENT_BINARY_DIR}/lib/extern/lib/liba.so)
set_target_properties(lib PROPERTIES IMPORTED_LOCATION ${CMAKE_CURRENT_BINARY_DIR}/lib/extern/lib/libb.so)
set_target_properties(lib PROPERTIES IMPORTED_LOCATION ${CMAKE_CURRENT_BINARY_DIR}/lib/extern/lib/liba12.so)
target_link_libraries(${PROJECT_NAME} PUBLIC lib)
target_include_directories(${PROJECT_NAME}
PUBLIC
$<INSTALL_INTERFACE:lib/extern/include>
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/lib/extern/include>
$<INSTALL_INTERFACE:include/public>
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include/public>
$<INSTALL_INTERFACE:include/private>
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include/private>
)
add_executable(test src/main.cpp)
target_link_libraries(test PRIVATE mylib)
ERROR:
[build] Consolidate compiler generated dependencies of target mylib
[build] [ 60%] Built target mylib [build] Consolidate compiler generated dependencies of target test
[build] gmake[2]: *** No rule exists to target „lib/extern/lib/liba12.so“,
[build] required by „test“ to create. Ending.
[build] gmake[1]: *** [CMakeFiles/Makefile2:111: CMakeFiles/test.dir/all] Error 2
[build] gmake: *** [Makefile:91: all] Error 2
[proc] The command: /usr/bin/cmake --build /home/mathew/proj/build --config Debug --target all -j 10 -- exited with code: 2 and signal: null [build] Build finished with exit code 2





Ваши импортированные файлы относятся к исходному каталогу, а не к каталогу сборки. Вам нужно использовать CMAKE_CURRENT_SOURCE_DIR вместо CMAKE_CURRENT_BINARY_DIR при установке IMPORTED_LOCATION.
После 6 часов программирования я заметил, что получаю неопределенные ссылки во включениях внешней библиотеки.... После использования **CMAKE_CURRENT_BINARY_DIR** вместо **CMAKE_CURRENT_SOURCE_DIR**
Во время компиляции: убедитесь, что lib/extern/lib упоминается в target_link_directories. Во время выполнения убедитесь, что динамический компоновщик может найти ваши библиотеки. Проще всего возиться с LD_LIBRARY_PATH.
target_link_directories не работал. Ошибка (неопределенная ссылка) не появляется в моем коде, но включает стороннюю общую библиотеку в /lib/extern/includes/headers..
Чего вы надеетесь достичь, установив
IMPORTED_LOCATIONдля одной и той же библиотеки три раза?