• 【cmake实战九】cmake常用指令


    • 本文讲解下如何将项目解决方案放置到一个文件夹中、以及其他命令的综合应用
    • cmake命令推荐小写,变量推荐大写。

    一、文件目录

    在这里插入图片描述

    1、main.cpp(aa.h为空)

    #include
    
    using namespace std;
    
    int main()
    {
    	cout<<"hello world"<<endl;
    	
    #ifdef OUTPUT_HAHA
    		cout<<"i use add_definitions OUTPUT_HAHA"<<endl;
    #endif OUTPUT_HAHA
    
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    2、CmakeLists.txt

    cmake_minimum_required(VERSION 3.8.0)
    
    set(TARGET "hello")
    set(TARGET_FOLDER_PATH "hello_folder")
    set(TARGET_OUTPUT_NAME "hello")
    
    PROJECT(NEWHELLO)
    
    option(HAHA_OUTPUT_FLAG "HAHA_OUTPUT_FLAG" ON)
    if(HAHA_OUTPUT_FLAG)
    	add_definitions(-DOUTPUT_HAHA)
    endif()
    
    #ZERO_CHECK监视CMakeLists.txt,如果CMakeLists.txt发生变化,则告诉编译器重新构建整个工程环境。
    #CMakeLists.txt中加入set(CMAKE_SUPPRESS_REGENERATION true),这样不会产生ZERO_CHECK工程,可以手工跑这个目标。
    set(CMAKE_SUPPRESS_REGENERATION 1)
    #使用相对路径
    set(CMAKE_USE_RELATIVE_PATHS ON)
    
    set(EXECUTABLE_OUTPUT_PATH "${PROJECT_SOURCE_DIR}/bin")  #可执行文件路径
    set(LIBRARY_OUTPUT_PATH "${PROJECT_SOURCE_DIR}/lib")     #静态库文件路径
    
    set(TARGET_BIN_OUTPUE_PATH "${PROJECT_SOURCE_DIR}/bin")  #可执行文件路径
    set(TARGET_LIB_OUTPUT_PATH "${PROJECT_SOURCE_DIR}/lib")  #静态库文件路径
    
    #默认关闭,打开后才可以使用属性FOLDER,
    #否则set_target_properties(${TARGET} PROPERTIES FOLDER "${TARGET_FOLDER_PATH}")会无效
    set_property(GLOBAL PROPERTY USE_FOLDERS ON)
    
    #头文件和源文件目录
    file(GLOB HEADERS "./*.h")
    source_group("include" FILES ${HEADERS})
    aux_source_directory(. SRC_LIST)
    source_group("source" FILES ${SRC_LIST})
    
    set(ALL_LIST ${HEADERS} ${SRC_LIST} "CmakeLists.txt")
    
    add_executable(${TARGET_OUTPUT_NAME} ${ALL_LIST})
    
    #版本
    set_target_properties(${TARGET} PROPERTIES VERSION 1.1.0.0) 
    #可执行文件输出目录
    set_target_properties(${TARGET} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${TARGET_BIN_OUTPUE_PATH}") 
    #lib输出目录
    set_target_properties(${TARGET} PROPERTIES ARCHIVE_OUTPUT_DIRECTORY "${TARGET_LIB_OUTPUT_PATH}")
    #二进制文件名字
    set_target_properties(${TARGET} PROPERTIES OUTPUT_NAME "${TARGET_OUTPUT_NAME}")
    #项目所在文件夹的目录
    set_target_properties(${TARGET} PROPERTIES FOLDER "${TARGET_FOLDER_PATH}")
    
    #安装
    install(TARGETS "${TARGET}" RUNTIME DESTINATION "${PROJECT_SOURCE_DIR}/hello")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52

    二、构建、编译、运行

    1、构建(新建build目录,在build目录下执行)

    cmake ..
    
    • 1

    2、编译

    devenv.com NEWHELLO.sln /Build "Debug|x64"
    
    • 1

    3、运行

    .\hello.exe
    
    • 1

    在这里插入图片描述

    4、使用vs打开构建的项目

    在这里插入图片描述

    5、安装完成后文件目录

    在这里插入图片描述

    二、set_target_properties

    set_target_properties(target1 target2 …
                          PROPERTIES prop1 value1
                          prop2 value2 …)
    
    • 1
    • 2
    • 3
    • 该指令为一个目标设置属性。用户可以调用 GET_TARGET_PROPERTY 命令取出属性的值。
    • 本文仅仅介绍几个属性,所有属性参考官方文档set_target_propertiesProperties on Targets

    1.VERSION、SOVERSION

    VERSION 指定构建的版本号,SOVERSION 指定构建的 API 版本号。

    set_target_properties(${TARGET} PROPERTIES VERSION 1.1.0.0) 
    
    • 1

    2.RUNTIME_OUTPUT_DIRECTORY

    #可执行文件输出目录

    set_target_properties(${TARGET} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${TARGET_BIN_OUTPUE_PATH}")
    
    • 1

    3.ARCHIVE_OUTPUT_DIRECTORY

    #静态库文件输出目录

    set_target_properties(${TARGET} PROPERTIES ARCHIVE_OUTPUT_DIRECTORY "${TARGET_LIB_OUTPUT_PATH}")
    
    • 1

    4.FOLDER

    • 项目所在文件夹的目录,如本文例子,把hello项目放入了hello_folder的文件夹内。
    • USE_FOLDERS 默认关闭,打开后才可以使用属性FOLDER,
    set_property(GLOBAL PROPERTY USE_FOLDERS ON)
    set_target_properties(${TARGET} PROPERTIES FOLDER "${TARGET_FOLDER_PATH}")
    
    • 1
    • 2

    三、install

    install(TARGETS <target>... [...])
    install(IMPORTED_RUNTIME_ARTIFACTS <target>... [...])
    install({FILES | PROGRAMS} <file>... [...])
    install(DIRECTORY <dir>... [...])
    install(SCRIPT <file> [...])
    install(CODE <code> [...])
    install(EXPORT <export-name> [...])
    install(RUNTIME_DEPENDENCY_SET <set-name> [...])
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    参数中的TARGET可以是很多种目标文件,最常见的是通过ADD_EXECUTABLE或者ADD_LIBRARY定义的目标文件,即可执行二进制、动态库、静态库:
    |-

    目标文件内容安装目录变量默认安装文件夹
    ARCHIVE静态库${CMAKE_INSTALL_LIBDIR}lib 、a
    LIBRARY动态库${CMAKE_INSTALL_LIBDIR}dll、so
    RUNTIME可执行二进制文件${CMAKE_INSTALL_BINDIR}bin
    PUBLIC_HEADER与库关联的PUBLIC头文件${CMAKE_INSTALL_INCLUDEDIR}include
    PRIVATE_HEADER与库关联的PRIVATE头文件${CMAKE_INSTALL_INCLUDEDIR}include

    1、例子,安装

    install(TARGETS "${TARGET}" RUNTIME DESTINATION "${PROJECT_SOURCE_DIR}/hello")
    
    • 1

    2、更改linux下start.sh的权限(赋予start.sh可执行权限)

    install(CODE "execute_process(
    		COMMAND /home/start.sh
    )")
    
    • 1
    • 2
    • 3

    3、执行sh文件

    install(CODE "execute_process(
    		COMMAND chomd 755 /home/start.sh  WORKING_DIRECTORY /home/
    )")
    
    • 1
    • 2
    • 3

    四、file

    • GLOB选项将会为所有匹配查询表达式的文件生成一个文件list,并将该list存储进变量variable里。
    FILE(WRITE filename "message to write"... )
     FILE(APPEND filename "message to write"... )
     FILE(READ filename variable)
     FILE(GLOB variable [RELATIVE path] [globbing
    expressions]...)
     FILE(GLOB_RECURSE variable [RELATIVE path]
     [globbing expressions]...)
     FILE(REMOVE [directory]...)
     FILE(REMOVE_RECURSE [directory]...)
     FILE(MAKE_DIRECTORY [directory]...)
     FILE(RELATIVE_PATH variable directory file)
     FILE(TO_CMAKE_PATH path result)
     FILE(TO_NATIVE_PATH path result)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    例子:

    file(GLOB HEADERS "./*.h")
    
    • 1

    CMake手册详解 (十)

    五、aux_source_directory

    • 作用是发现一个目录下所有的源代码文件并将列表存储在一个变量中,这个指令临时被用来 自动构建源文件列表。
    • 例子:
    aux_source_directory(. SRC_LIST)
    
    • 1

    七、source_group

    • 把文档归类(如上图把头文件和cpp文件分别归档到了include和source)
    • 例子
    source_group("source" FILES ${SRC_LIST})
    
    • 1

    八、include

    用来载入 CMakeLists.txt 文件,也用于载入预定义的 cmake 模块.(本例子中没有用到)
    include (file1 [OPTIONAL])
    include (module [OPTIONAL])
    OPTIONAL 参数的作用是文件不存在也不会产生错误。 你可以指定载入一个文件,如果定义的是一个模块,那么将在 CMAKE_MODULE_PATH 中搜 索这个模块并载入。

    八、option

    • 选项开关,可以使用ON 或者OFF来控制。
    option(<variable> "" [value])
    
    • 1
    option(HAHA_OUTPUT_FLAG "HAHA_OUTPUT_FLAG" ON)
    if(HAHA_OUTPUT_FLAG)
    	add_definitions(-DOUTPUT_HAHA)
    endif()
    
    • 1
    • 2
    • 3
    • 4

    九、add_definitions

    • 定义在代码中可以用到的宏
    • CmakeLists.txt
    add_definitions(-DOUTPUT_HAHA)
    
    • 1
    • main.cpp
    #ifdef OUTPUT_HAHA
    		cout<<"i use add_definitions OUTPUT_HAHA"<<endl;
    #endif OUTPUT_HAHA
    
    • 1
    • 2
    • 3

    十、cmake的阶段

    前面几篇文章,几乎都讲到了构建和编译等,今天在这里再介绍几个关于构建、编译、安装的小知识点。

    1、构建阶段

    • 在源码目录用-B直接创建build目录并生成build/Makefile,免去了先创建目录再切换进去制定源码目录的麻烦
    • 如果不加-B,需要自己建立win_build目录。
    cmake -B win_build
    #cmake -B win_build -DCMAKE_INSTALL_PREFIX =~/install -DCMAKE_BUILD_TYPE=DEBUG
    #cmake -B win_build -G "Visual Studio 16 2019"
    
    • 1
    • 2
    • 3

    2、编译阶段

    • 自动调用本地的构建系统在build里面构建
    • 下面这种方式可以兼容windows和linux,在windows下调用devenv.com,linux下调用make
    cmake --build win_build
    #等价于下面的命令
    #devenv.com ./win_build/NEWHELLO.sln /Build "Debug|x64"
    
    • 1
    • 2
    • 3

    3、安装

    • "cmake --build win_build --target install"在windows和linux下通用
    cmake --build win_build --target install
    #等价于下面的命令
    #devenv.com ./win_build/NEWHELLO.sln /build “Debug|x64” /project “INSTALL”
    
    • 1
    • 2
    • 3

    4、-G 选择编译器

    • 可以用-G参数改用别的生成器,例如cmake -GNinja -B build

    参考

    1.CMake 命令笔记

    2.【CMake】cmake的install指令

    3.补充番外14:cmake笔记

  • 相关阅读:
    sop作业指导书怎么做?sop标准作业指导书用什么软件做?
    娄底干细胞制备实验室建设须知要求
    《Head First HTML5 javascript》第3章 探索浏览器 知识点总结
    单应用多语言切换(语言国际化)
    查看mysql 容量
    使用 Python 创建您自己的NFT集合(一)自己动手制作中秋月饼上链送给亲朋好友
    解决Microsoft Edge无法正常运行的有效方案分享!
    虹科案例 | EtherCAT运动控制器与IO在半导体封装设备固晶机上的应用
    优麒麟安装完后设置root密码
    【毕业设计】大数据-实时疫情数据可视化项目 - flask python
  • 原文地址:https://blog.csdn.net/junxuezheng/article/details/126773903