• CMake 笔记


    1. Linux 系统介绍

    1.1 目录结构
    • 相对路径:./:当前目录, ../:上一级目录

    • 绝对路径

    1.2 指令与选项

    (1)完整的命令格式

    命令(空格)[选项](空格)[操作对象]    
    
    • 1

    (2)常用操作命令

    • pwd:打印当前工作目录;

    • ls:列出当前工作目录下所有文件/文件夹名称;

    • cd:切换当前工作目录;

    • mkdir创建目录

    • touch:创建新文件,如 touch myfile.txt

    • rm:删除文件/文件夹,且不可恢复,慎用;

    # 删除当前路径下的 file 文件
    rm file.txt
    
    # 删除绝对路径下的 file 文件
    rm /home/file.txt
    
    # 删除当前路径下所有文件/文件夹
    rm -rf myfolder
    
    # 删除绝对路径下所有文件/文件夹
    rm -rf /home/myfolder
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • cp:复制文件/文件夹到指定位置

    • mv:移动文件到新的位置,或者重命名文件

    2. GCC 编译器

    实际使用中:

    • 使用 gcc 编译 c 代码

    • 使用 g++ 编译 c++ 代码

    2.1 编译过程
    1. 预处理:将头文件包含的内容都展开
    # -E 表示编译器仅对输入文件进行
    
    g++ -E test.cpp -o test .i
    
    • 1
    • 2
    • 3

    注意:-o 表示输出 out,也就是 .cpp 输出为 .i

    1. 编译:生成汇编语言文件
    # -S 编译选项告诉 g++ 在为 C++ 代码产生了汇编文件后停止编译
    
    # g++ 产生的汇编语言文件的缺省扩展名为 .s
    
    g++ -S test.i -o test.s
    
    • 1
    • 2
    • 3
    • 4
    • 5
    1. 汇编:生成二进制文件
    # -C 选项告诉 g++ 仅把源代码编译为机器语言的目标代码
    
    # 缺省的扩展名为 -o
    
    g++ -C test.s -o test.o
    
    • 1
    • 2
    • 3
    • 4
    • 5
    1. 链接:生成可执行文件
    # 生成可执行文件 .bin 文件
    
    g++ test.o -o test
    
    • 1
    • 2
    • 3
    1. 实际处理时,直接用
    g++ test.cpp -o test   
    
    ./test
    
    • 1
    • 2
    • 3
    2.2 g++ 重要编译参数

    (1)-g 编译带调试信息的可执行文件

    g++ -g test.cpp -o test
    
    • 1

    (2)-O[n] 优化源代码,可以提高源代码的运行效率。

    -O0 表示不作优化
    -O1 作默认优化
    -O2 除了完成 -O1 的优化外,还进行一些额外的调整工作
    -O3 进一步优化
    
    g++ -O2 test.cpp -o test
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    (3)-l-L :分别指定库文件和库文件路径

    (4)-I 指定头文件搜索目录

    (5)-std=c++11:设定编译标准

    (6)-o:指定输出文件名

    g++ test.cpp -o test01

    2.3 实例

    假设有如下工作目录:

    .
    |——include
    |   |___Swap.h
    |——main.cpp
    |——src
    |   |___Swap.cpp
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    2.3.1 直接编译执行

    执行命令

    g++ main.cpp src/Swap.cpp -Iinclude -o main
    ./main
    
    • 1
    • 2

    -I 后面是头文件目录

    也可添加其他编译选项。

    2.3.2 生成库文件并编译

    就是一段编译好的二进制文件。

    1、链接 静态库 生成可执行文件

    # 进入 src 目录下
    cd src
    
    # 汇编,生成 .o 文件
    g++ Swap.cpp -C -I../include      // -C 表示汇编生成 Swap.o 文件
    
    # 生成静态库 libSwap.a
    ar rs libSwap.a Swap.o
    
    # 回到上级目录
    cd ..
    
    # 链接静态库并执行
    g++ main.cpp -lSwap -Lsrc -o static_main
    ./static_mian
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    2、链接 动态库 生成可执行文件

    # 进入 src 目录下
    cd src
    
    # 生成动态库 libSwap.so
    g++ Swap.cpp -I../include -fPIC -shared -o libSwap.so
                                   // -shared 表示生成动态库
    
    # 回到上级目录
    cd ..
    
    # 链接动态库并执行
    g++ mian.cpp -Iinlude -lSwap -Lsrc -o dyna_mian
    
    LD_LIBRARY_PATH = src ./dyna_main
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    注意执行文件时的区别:静态库的代码在编译的过程中已经载入到可执行文件中,故直接运行即可;而动态库是分开的,只保留接口,需要调用,不在同一目录下时,需添加路径。所以,静态库也会比较大。

    Windows 中静态库扩展名为 .lib,动态库扩展名为 .dll

    3. GDB 调试器

    4. VSCode

    5. CMake

    5.1 语法特性

    (1)基本语法格式:指令(参数1 参数2)

    中间用空格或分号隔开。

    (2)指令和大小写无关,参数和变量是大小写相关的。

    5.2 重要指令和 CMake 常用变量
    5.2.1 重要指令

    (1)cmake_mininum_required:指定 CMake 最小版本要求

    cmake_mininum_required(VERSION 2.8.3)
    
    • 1

    (2)project:定义工程名称,并可指定工程支持的语言

    project(HELLOWORLD)
    
    • 1

    (3)set:显式的定义变量

    # 定义变量 SRC,其值为 hello.cpp、sayhello.cpp
    set(SRC hello.cpp sayhello.cpp)
    
    • 1
    • 2

    (4)include_directories:向工程添加多个特定的头文件搜索路径,相当于指定 g++ 编译器的 -I 参数。

    include_directories(/home/include)
    
    • 1

    (5)link_directories:向工程添加多个特定的库文件搜索路径,相当于指定 g++ 编译器的 -L 参数。

    link_directories(dir1 dir2)
    
    # 绝对路径、相对路径均可
    link_directories(/home/myfolder ./lib)
    
    • 1
    • 2
    • 3
    • 4

    (6)add_library:生成静态库/动态库文件

    通过变量 SRC 生成libhello.so 共享库
    add_library(hello SHARED ${SRC})
    
    • 1
    • 2

    这里的 SRC 就是前面定义的变量。

    (7)add_compile_options:添加编译参数

    # 添加编译参数 -wall -std=c++11 -O2
    add_compile_options(-wall -std=c++11 -O2)
    
    • 1
    • 2

    (8)add_executable:生成可执行文件

    # 编译 main.cpp 生成可执行文件 main
    add_executable(main main.cpp)
    
    • 1
    • 2

    (9)target_link_libraries:为 target 添加需要链接的共享库,相当于指定 g++ 编译器的 -l 参数

    # 将 hello 动态库文件链接到可执行文件 main
    target_link_libraries(main hello)
    
    • 1
    • 2

    (10)add_subdirectory:向当前工程添加存放源文件的子目录,并可以指定中间二进制和目标二进制存放点的位置

    # 添加 src 子目录,src 中需要有一个 CMakeLists.txt
    add_subdirectory(src)
    
    • 1
    • 2

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

    # 定义 SRC 变量,其值为当前目录下所有的源代码文件
    aux_source_directory(. SRC)
    
    # 编译,并生成 main 可执行文件
    add_executale(main ${SRC})
    
    • 1
    • 2
    • 3
    • 4
    • 5
    5.2.2 CMake 常用变量
    5.3 CMake 编译工程

    编译过程:

    • 写 CMakeLists.txt 文件

    • 生成 Makefile 文件

    • 执行命令 make 进行编译

    1、最小 CMake 工程

    2、多文件 CMake 编译

    假设有如下工作目录:

    .
    |——include
    |   |___Swap.h
    |——main.cpp
    |——src
    |   |___Swap.cpp
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    CMakeLists.txt 文件为

    cmake_mininum_required(VIRSION 3.10)
    
    project(SWAP)
    
    add_directories(include)
    
    add_executable(main main.cpp src/Swap.cpp )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    外部构建(这样文件夹更整洁),终端中输入

    mkdir build
    cd build
    cmake ..
    make
    ./main
    
    • 1
    • 2
    • 3
    • 4
    • 5

    当然,上面也等价于

    g++ main.cpp src/Swap.cpp -Iinclude -o main
    ./main
    
    • 1
    • 2

    6 综合应用

    6.1 合理设置项目目录
    .
    |——build
    |——include
    |   |___...
    |——src
    |   |___...
    |——main.cpp
    |——CMakeLists.txt
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    6.2 .json 文件配置
  • 相关阅读:
    Oracle/PLSQL: Lead Function
    nodejs+vue+elementui养老院老年人服务系统er809
    专业安卓实时投屏软件:极限投屏(QtScrcpy作者开发)使用说明
    8000字,程序性能优化的全能手册
    node.js npm 使用 vue 编写
    Spring MVC @Controller和@RequestMapping注解
    Nmap 操作手册 - 完整版
    如何遍历collections.OrderedDict,服了又忘记items
    Spring Boot Admin 参考指南
    SpringBoot-快速入门
  • 原文地址:https://blog.csdn.net/qq_44175983/article/details/133611331