target_link_libraries需要放在add_executable之后,用于指明连接进来的库,官方推荐使用这个接口,而不推荐使用link_libraries,link_libraries需要放到add_executable之前。
当编写一个大工程,使用add_subdirectory包括其他的工程,比如下列目录这种情况
├── bit_operate
│ ├── CMakeLists.txt
├── cmake
│ └── toolschain
├── CMakeLists.txt
├── compile.sh
├── container
│ ├── CMakeLists.txt
├── core
│ ├── CMakeLists.txt
├── data
│ ├── CMakeLists.txt
├── encrype_decrype
│ ├── CMakeLists.txt
├── io
│ ├── CMakeLists.txt
├── ipc
│ ├── CMakeLists.txt
├── README.md
├── stat.sh
根目录的CMakeLists.txt内容如下:
cmake_minimum_required(VERSION 3.5)
project (main)
message("DEBUG" ${CMAKE_CXX_FLAGS})
if(CMAKE_BUILD_TARGET STREQUAL ArmPoky)
#設置toolchain文件路徑
set(CMAKE_TOOLCHAIN_FILE
${CMAKE_SOURCE_DIR}/cmake/toolschain/ArmPony.cmake)
message(STATUS "CMAKE_TOOLCHAIN_FILE:" ${CMAKE_TOOLCHAIN_FILE})
else()
#HOST ENV
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
endif()
message("DEBUG" ${CMAKE_CXX_FLAGS})
# Add an executable
#add_executable(main test_printf.cpp)
add_subdirectory(encrype_decrype)
add_subdirectory(core)
add_subdirectory(io)
add_subdirectory(ipc)
add_subdirectory(container)
add_subdirectory(assemebly_language)
add_subdirectory(bit_operate)
add_subdirectory(data)
add_subdirectory(openssl)
if(CMAKE_BUILD_TARGET STREQUAL ArmPoky)
SET(CMAKE_ARM_COMPILATION 1)
endif()
最开始想当然,在这个文件的最后的add_subdirectory命令下面添加target_link_libraries接口,但是报错:
Attempt to add link library "libreadline.so" to target "TEST_FILE_IO" which
is not built in this directory
然后把target_link_libraries放到对应TEST_FILE_IO的工程CMakeLists.txt中,不再报错。
cmake_minimum_required(VERSION 3.5)
# Set the project name
project (TEST_FILE_IO)
# Add an executable
add_executable(TEST_FILE_IO getfiles.cpp)
target_link_libraries(TEST_FILE_IO libreadline.so)
所以target_link_libraries需要跟着add_executable或者类似功能(指明编译可执行文件或者编译库)的接口走。