上面写了一个大概,本篇文章主要介绍 target 的属性。target 指的就是 executable 文件和 liabrary 文件。
target_include_directories(), target_compile_definitions(), target_compile_options() 。
说实话,我不是很清楚这三个函数的作用,所以我只能根据我的经验来猜测他们大致的意思!
首先三个 command 都是针对 target 的,include_directories 应该是关联查找*.h的路径,compile_definitions 应该是定义编译的宏信息,compile_options 应该是给cmake命令用的,用来决定使用什么编译方式。
另外这个三个命令还有三个额外的模式private, public, interface。
private指的是将属性只应用到本target
public指的是将属性应用到本target和以后link的所有target
interface指的是讲属性应用到以后link的所有target
INCLUDE_DIERECTORIES,COMPILE_DEFINITIONS,COMPILE_OPTIONS 存入了具有private 和 public的模式
INTERFACE_INCLUDE_DIRECTORIES,INTERFACE_COMPILE_DEFINITIONS,INTERFACE_COMPILE_OPTIONS 存入具有 interface 和 public 的模式
set(srcs archive.cpp zip.cpp)
if (LZMA_FOUND)
list(APPEND srcs lzma.cpp)
endif()
add_library(archive SHARED ${srcs})
if (LZMA_FOUND)
# The archive library sources are compiled with -DBUILDING_WITH_LZMA
target_compile_definitions(archive PRIVATE BUILDING_WITH_LZMA)
endif()
target_compile_definitions(archive INTERFACE USING_ARCHIVE_LIB)
add_executable(consumer)
# Link consumer to archive and consume its usage requirements. The consumer
# executable sources are compiled with -DUSING_ARCHIVE_LIB.
target_link_libraries(consumer archive)
上面的代码 archive 的 target 具有 -DBUILDING_WITH_LZMA,但是不具有 -DUSING_ARCHIVE_LIB,这个是 PRIVATE 和 INTERFACE 的区别,另外 consumer 的 target 不具有 -DBUILDING_WITH_LZMA,具有 -DUSING_ARCHIVE_LIB!
像 LZMA_FOUND 这个东西,就是一个OPTIONS,这个是可以用 compile_options 的命令指定。
网友评论