在Ubuntu中,我下载了一个第三方共享库(liba1.so),放在/lib/external/lib中。相关的头文件我放在/lib/external/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
导入的文件相对于源目录,而不是构建目录。设置IMPORTED_LOCATION
时,需要使用CMAKE_CURRENT_SOURCE_DIR
,而不是CMAKE_CURRENT_BINARY_DIR
。