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或者类似功能(指明编译可执行文件或者编译库)的接口走。