build system

添加target

  1. add_executable(mytool mytool.cpp)添加可执行target
  2. add_library(archive SHARED archive.cpp zip.cpp lzma.cpp)添加lib,lib类型包括:
  • SHARED:动态库/共享库,dll/so/dylib
  • STATIC:静态库,.lib/.a
  • MODULE:插件资源文件等类型,不导出符号,不可用于链接,用于动态加载
  • OBJECT:不用于生成库文件,定义表示obj文件集合的变量
add_library(archive OBJECT archive.cpp zip.cpp lzma.cpp)
add_library(archiveExtras STATIC $ extras.cpp)
add_executable(test_exe $ test.cpp)

定义编译参数

# 对应gcc/clang的 -I
target_include_directories(target, 
                      )
# 对应gcc/clang的-D
target_compile_definitions(target, 
                      <宏定义>)
# 对应gcc/clang的-f/-m/-W
target_compile_options(target,
                      <编译器flag>)

这三个指令定义了target的两组属性:

以下三个属性编译自己时使用

  • INCLUDE_DIRECTORIES
  • COMPILE_DEFINITIONS
  • COMPILE_OPTIONS

target_link_libraries(a b)时a会从b的以下三个属性继承值到自己的属性,
a.INCLUDE_DIRECTORIES += b.INTERFACE_INCLUDE_DIRECTORIES

  • INTERFACE_INCLUDE_DIRECTORIES,
  • INTERFACE_COMPILE_DEFINITIONS,
  • INTERFACE_COMPILE_OPTIONS

modle可以是以下三个类型:

  • PRIVATE:只有源文件使用,只定义非INTERFACE_变量
  • PUBLIC:源文件和头文件都使用,两组变量都定义
  • INTERFACE:只有头文件使用,只定义INTERFACE_变量
add_library(archive archive.cpp)
target_compile_definitions(archive INTERFACE USING_ARCHIVE_LIB)

add_library(serialization serialization.cpp)
target_compile_definitions(serialization INTERFACE USING_SERIALIZATION_LIB)

add_library(archiveExtras extras.cpp)
target_link_libraries(archiveExtras PUBLIC archive)
target_link_libraries(archiveExtras PRIVATE serialization)
# archiveExtras is compiled with -DUSING_ARCHIVE_LIB and -DUSING_SERIALIZATION_LIB

add_executable(consumer consumer.cpp)
# consumer is compiled with -DUSING_ARCHIVE_LIB
target_link_libraries(consumer archiveExtras)

# 可以同时link多个不同的model
target_link_libraries(archiveExtras
  PUBLIC archive
  PRIVATE serialization
)

# include可以时绝对路径或相对路径(相对于当前CMakeLists.txt)
add_library(lib1 lib1.cpp)
target_include_directories(lib1 PRIVATE
  /absolute/path
  relative/path
)

target输出目录

RUNTIME_OUTPUT_DIRECTORY和RUNTIME_OUTPUT_NAME控制以下target的输出目录和文件名称

  • add_executable()生成的可执行文件
  • add_library(target SHARED ...)在Windows上生成的动态库

LIBRARY_OUTPUT_DIRECTORY和LIBRARY_OUTPUT_NAME控制以下target的输出目录和文件名称

  • add_library(target MODULE ...)生成的不导出符号的插件动态库
  • add_library(target SHARED ...)在linux/osx上生成的动态库

ARCHIVE_OUTPUT_DIRECTORY和ARCHIVE_OUTPUT_NAME控制以下target的输出目录和文件名称

  • add_library(target STATIC ...)生成的静态库
  • add_library(target SHARED ...)在Windows上生成动态库时,导出符号所在的.lib文件
  • add_executable()在Windows上设置了ENABLE_EXPORTS属性时,导出符号所在的.lib文件
add_executable(redis main.c)

set_target_properties(redis
        PROPERTIES RUNTIME_OUTPUT_DIRECTORY lib)
set_target_properties(redis
        PROPERTIES RUNTIME_OUTPUT_NAME test)

编译一些简单的项目,这些就够用啦!!!

你可能感兴趣的:(build system)