添加target
-
add_executable(mytool mytool.cpp)
添加可执行target -
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 $<TARGET_OBJECTS:archive> extras.cpp)
add_executable(test_exe $<TARGET_OBJECTS:archive> test.cpp)
定义编译参数
# 对应gcc/clang的 -I
target_include_directories(target,
<model> <include文件夹>)
# 对应gcc/clang的-D
target_compile_definitions(target,
<model> <宏定义>)
# 对应gcc/clang的-f/-m/-W
target_compile_options(target,
<model> <编译器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)
编译一些简单的项目,这些就够用啦!!!
网友评论