CMake学习
1.创建工程
#设置工程名
project($(project_name))
#设置临时变量/修改变量名
set(variable_name variable_value,variable_value1,.. CACHE )#cache可以缓存
#设置工程文件显示分组
SOURCE_GROUP("showname" FILES ${file})
#生成可执行文件
add_execute($(project_name) $(sourcefile))
2.生成静、动态库
#生成静态库
add_library(name STAIC/SHARE $(sourcefile)) #static为静态库,share为动态库
#添加依赖项
add_dependencies(name depend_name)
#为一个目标添加头文件路径
target_inlude_directories(name PUBLIC ${PROJECT_SOURCE_DIR}/include)
set_target_properties(name PROPERTIES INTERFACE_INCLUDE_DIRECTORIES ${includefiepath}) #通过设置属性的方式
#添加include路径
include_directories(${CMAKE_CURRENT_SOURCE_DIR})
3.创建导入式库文件
#生成导入式库文件目标,引用工程之外的库文件
add_library(name STATIAC/SHARE IMPORTED GLOBAL)
#设置属性IMPORTED_LOCATION,指定库文件位置
set_target_properties(name PROPERTIES IMPORTED_LOCATION ${filepath})
#静态库有时需要分别设置debug和release两种模式下的lib
IMPORTED_LOCATION_DEBUG #DEBUG模式,一般debuglib名称以d结尾
IMPORTED_LOCATION_RELEASE #RELEASE 模式
#如果是动态库,需要设置IMPORTED_IMPLIB
4.目标对象链接库文件
target_link_libraries(${project_name} # 可执行文件、目标
PRIVATE # 链接限制 private/public/interface
name) # 库文件
5.添加子目录
add_subdirectory(${directoryname})
6.输出变量值
message(WARNING "")
message(${variavle_name})
7.忽略相应的CMP警告,
cmake_policy(SET CMP OLD)
8.通过cmake生成工程
下载cmake APP,打开代码文件夹带cmakelists.txt的最外层,选择工程生成目录,最好是在文件夹最外层的build。配置好configure,主要是选择visual studio版本号,然后生成工程。
9.默认全局变量
CMAKE_CURRENT_SOURCE_DIR #当前cmake所在文件夹路径
10.默认把当前工程所有头文件和cpp文件分组
file(GLOB_RECURSE OBJECT_HDRS "*.h")
file(GLOB_RECURSE OBJECT_SRCS "*.cpp" "*.hpp")
11.生成库文件时自动将头文件include路径添加到引用工程
在生成库文件的cmakelists中加入:
set_target_properties(${project} PROPERTIES INTERFACE_INCLUDE_DIRECTORIES ${CMAKE_CURRENT_SOURCE_DIR})
#最后一个参数需要是有效的头文件路径,文件夹下必须含有文件
#可以选择哪些头文件路径可以暴露
list(APPEND LIB_INCLUDE_DIRS "${include_dir_path}")
list(APPEND LIB_INCLUDE_DIRS "${include_dir_path_2}")
set_target_properties(${project} PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${LIB_INCLUDE_DIRS }")
12.拷贝动态库的dll
add_custom_command(TARGET ${PROJECT})
POST_BUILD
COMMAND ${CMAKE_COMMAND} -E
copy_if different
$<TARGET_FILE:zlib>
$<TARGET_FILE:XML>)
13.相反写法 if(NOT WIN32)
14.target_compile_definitions(${PROJECT} PRIVATE NAME_LIBRARY)
编译给定时使用指定的编译定义。 必须是 add_executable() 或者 add_library() 创建的,并且不是一个输入目标。