学习CMake(二)

上面写了一个大概,本篇文章主要介绍 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 的命令指定。

你可能感兴趣的:(学习CMake(二))