• 浅浅的 Cmake



    参考资源:
    https://zhuanlan.zhihu.com/p/119426899
    https://blog.csdn.net/fengzhongluoleidehua/article/details/79809756
    https://blog.csdn.net/dabenxiong666/article/details/53998998
    添加头文件 https://blog.csdn.net/weixin_44100850/article/details/103697973

    一、Cmake安装和基本使用

    1、下载Cmake

    环境Ubuntu18

    sudo apt install cmake
    
    • 1

    查看版本号

    sudo cmake --version
    
    • 1

    2、尝试第一次编译

    建立一个文件夹,里面有:
    测试源文件:main.cpp
    Cmake文件:CMakeLists.txt
    一个存放编译文件的空文件夹:bulid
    main.cpp:

    #include 
    int main (int argc, char *argv[])
    {
      printf("123\n");
      return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    CmakeLists.txt

    3、替换成变量

    https://www.cnblogs.com/narjaja/p/9533174.html

    # VERSION需要和本机安装的Cmake对应
    cmake_minimum_required(VERSION 3.16.3) 
    
    # 设置工程名称,最后输出的可执行文件名称
    project(App) 
    
    # 添加可执行文件添加需要编译的文件 
    add_executable(App main.cpp) 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    进入到bulid目录下,开始编译

    Cmake ..
    
    • 1
    make
    
    • 1

    最终得到可执行文件App。

    使用变量替换生存的执行文件:

    # VERSION需要和本机安装的Cmake对应
    cmake_minimum_required(VERSION 3.16.3) 
    
    #通过PROJECT指令定义的项目名称 :https://www.cnblogs.com/narjaja/p/9533174.html
    set (PROJECT_NAME tianxiaohua)
    
    # 设置工程名称,最后输出的可执行文件名称
    project(${PROJECT_NAME}) 
    
    # 添加可执行文件添加需要编译的文件 
    add_executable(${PROJECT_NAME} main.cpp) 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    二、Cmake头文件

    https://www.cnblogs.com/binbinjx/p/5626916.html

    1、在原来的项目路径基础上可以增加main.h头文件

    // the configured options and settings for Tutorial
    #define Tutorial_VERSION_MAJOR 0
    #define Tutorial_VERSION_MINOR 0
    
    • 1
    • 2
    • 3

    修改原来的源文件:

    // A simple program that computes the square root of a number
    #include 
    #include 
    #include 
    #include "main.h"
     
    int main (int argc, char *argv[])
    {
      if (argc < 2)
        {
        fprintf(stdout,"%s Version %d.%d\n",argv[0],Tutorial_VERSION_MAJOR,Tutorial_VERSION_MINOR);
        fprintf(stdout,"Usage: %s number\n",argv[0]);
        return 1;
        }
      double inputValue = atof(argv[1]);
      double outputValue = sqrt(inputValue);
      fprintf(stdout,"The square root of %g is %g\n",
              inputValue, outputValue);
      return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    2、增加头文件

    修改Cmake:

    include_directories([AFTER|BEFORE] [SYSTEM] dir1 [dir2 …])
    它相当于g++选项中的-I参数的作用,也相当于环境变量中增加路径到CPLUS_INCLUDE_PATH变量的作用。

    CmakeLists.txt

    # VERSION需要和本机安装的Cmake对应
    cmake_minimum_required(VERSION 3.16.3) 
    
    #通过PROJECT指令定义的项目名称 
    set (PROJECT_NAME tianxiaohua)
    
    # 设置工程名称,最后输出的可执行文件名称
    project (${PROJECT_NAME})
    
    # 添加编译选项
    add_compile_options(-std=c++11)
    
    # 添加头文件的路径
    include_directories(/)
     
    # 添加可执行文件添加需要编译的文件 
    add_executable(${PROJECT_NAME}  main.cpp)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    重新进入bulid文件内,编译执行。

    三、添加多个源文件和多组源文件

    cmake自动添加所有源文件和头文件 https://blog.csdn.net/sep4075/article/details/120001415

    1、新建多个源文件和头文件

    在这里插入图片描述
    2、新的cmake源码
    参考:https://www.cnblogs.com/dilex/p/11102152.html

    # VERSION需要和本机安装的Cmake对应
    cmake_minimum_required(VERSION 3.16.3) 
    
    #通过PROJECT指令定义的项目名称 
    set (PROJECT_NAME tianxiaohua)
    
    # 设置工程名称,最后输出的可执行文件名称
    project (${PROJECT_NAME})
    
    # 添加编译选项
    add_compile_options(-std=c++11)
    
    # 添加头文件的路径
    include_directories(Include)
    
    # 查找source目录下的所有*.cpp,*.c源文件,并将文件列表保存到 DIR_LIB_SRCS 变量,遍历获取source/路径下所有的*.cpp和*.c文件列表
    file(GLOB_RECURSE SRC_DIR_LIST "Source/*.cpp" "Source/*.c")
    
    # 添加可执行文件添加需要编译的文件 
    add_executable(${PROJECT_NAME} ${SRC_DIR_LIST})
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    另外的方法:

    # CMake 最低版本号要求
    cmake_minimum_required(VERSION 3.0)
    
    # 项目名称
    project(CMakeFile)
    
    # 设置md5代码文件的路径
    set(MD5_FILE "./common/md5/md5.cpp" "./common/md5/md5.h")
    
    # 查找指定目录下的所有.cpp与.h文件 并存放到指定变量名SC_FILES中
    FILE(GLOB SC_FILES "*.cpp" "*.h")
    
    # 对md5的源码分组到md5组里
    source_group(md5 FILES ${MD5_FILE})
    
    # 指定生成目标
    add_executable(${PROJECT_NAME} ${SC_FILES} ${MD5_FILE})
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    四、包含其他库文件

     add_executable(。。。)
     target_link_libraries(。。。)
    
    • 1
    • 2

    五、生成库文件

    1、新的Cmake文件

    # VERSION需要和本机安装的Cmake对应
    cmake_minimum_required(VERSION 3.16.3) 
    
    #通过PROJECT指令定义的项目名称 
    set (PROJECT_NAME tianxiaohua)
    
    # 设置工程名称,最后输出的可执行文件名称
    project (${PROJECT_NAME})
    
    # 添加编译选项
    add_compile_options(-std=c++11)
    
    # 添加头文件的路径
    include_directories(Include)
    
    # 查找source目录下的所有*.cpp,*.c源文件,并将文件列表保存到 DIR_LIB_SRCS 变量,遍历获取source/路径下所有的*.cpp和*.c文件列表
    file(GLOB_RECURSE SRC_DIR_LIST "Source/*.cpp" "Source/*.c")
    
    # 将DIR_LIB_SRCS中文件列表以静态库的方式加入工程//将DIR_LIB_SRCS中文件列表以静态库的方式加入工程
    add_library(
        ${PROJECT_NAME} # 生成的输出个输出工程文件名称
        STATIC          # STATIC生成静态库文件.a  SHARED生成动态库文件.so
        ${SRC_DIR_LIST} # 所有源文件的集合
    ) 
    
    # 打印SRC_DIR_LIST中列表信息
    message(STATUS "SRC_DIR_LIST = ${SRC_DIR_LIST}")			
    
    
    # 添加可执行文件添加需要编译的文件 
    #add_executable(${PROJECT_NAME}  main.cpp)
    
    • 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

    七、

    CMake常用变量

    变量名 变量说明
    PROJECT_NAME 返回通过PROJECT指令定义的项目名称
    PROJECT_SOURCE_DIR CMake源码地址,即cmake命令后指定的地址
    PROJECT_BINARY_DIR 运行cmake命令的目录,通常是PROJECT_SOURCE_DIR下的build目录
    CMAKE_MODULE_PATH 定义自己的cmake模块所在的路径
    CMAKE_CURRENT_SOURCE_DIR 当前处理的CMakeLists.txt所在的路径
    CMAKE_CURRENT_LIST_DIR 当前文件夹路径
    CMAKE_CURRENT_LIST_FILE 输出调用这个变量的CMakeLists.txt的完整路径
    CMAKE_CURRENT_LIST_LINE 输出这个变量所在的行
    CMAKE_RUNTIME_OUTPUT_DIRECTORY 生成可执行文件路径
    CMAKE_LIBRARY_OUTPUT_DIRECTORY 生成库的文件夹路径
    CMAKE_BUILD_TYPE 指定基于make的产生器的构建类型(Release,Debug)
    CMAKE_C_FLAGS *.C文件编译选项,如 -std=c99 -O3 -march=native
    CMAKE_CXX_FLAGS *.CPP文件编译选项,如 -std=c++11 -O3 -march=native
    CMAKE_CURRENT_BINARY_DIR target编译目录
    CMAKE_INCLUDE_PATH 环境变量,非cmake变量
    CMAKE_LIBRARY_PATH 环境变量
    CMAKE_STATIC_LIBRARY_PREFIX 静态库前缀, Linux下默认为lib
    CMAKE_STATIC_LIBRARY_SUFFIX 静态库后缀,Linux下默认为.a
    CMAKE_SHARED_LIBRARY_PREFIX 动态库前缀,Linux下默认为lib
    CMAKE_SHARED_LIBRARY_SUFFIX 动态库后缀,Linux下默认为.so
    BUILD_SHARED_LIBS 如果为ON,则add_library默认创建共享库
    CMAKE_INSTALL_PREFIX 配置安装路径,默认为/usr/local
    CMAKE_ABSOLUTE_DESTINATION_FILES 安装文件列表时使用ABSOLUTE DESTINATION 路径
    CMAKE_AUTOMOC_RELAXED_MODE 在严格和宽松的automoc模式间切换
    CMAKE_BACKWARDS_COMPATIBILITY 构建工程所需要的CMake版本
    CMAKE_COLOR_MAKEFILE 开启时,使用Makefile产生器会产生彩色输出
    CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS 用来控制IF ELSE语句的书写方式

    使用CMake交叉编译Arm Linux程序

    https://blog.csdn.net/whahu1989/article/details/104114515

  • 相关阅读:
    UE4 TCP协议连接服务器与客户端
    sql8(Leetcode1581进店却未进行过交易的顾客)
    session和cookie和token
    vue模板语法上集
    java学习:八大基本类型变量
    相似度loss汇总,pytorch code
    聊一聊 tcp/ip 在.NET故障分析的重要性
    node使用jsonwebtoken生成token与验证是否过期
    Python异步协程(asyncio详解)
    黑豹程序员-架构师学习路线图-百科:AJAX
  • 原文地址:https://blog.csdn.net/qq_44179528/article/details/126542158