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() 创建的,并且不是一个输入目标。

posted @ 2021-12-15 17:25  北冥没有鱼  Views(442)  Comments(0Edit  收藏  举报