target_link_libraries接口的使用

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

猜你喜欢

转载自blog.csdn.net/MashiMaroJ/article/details/127859775