IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发工具 -> CMake新解 -> 正文阅读

[开发工具]CMake新解

Basic concept of CMake

  • CMake的优势:
    The power of CMake comes from the fact that you can use the same build specification –that is, CMakeLists.txt – for various compiler toolchains without the need to rewrite anything.
  • 关于生成器:(调节-G参数)
    分为单目标生成器(各种Make和Ninja)和多目标生成器(Visual Studio和XCode),它们都是写在CMAKE_MAKE_PROGRAM:FILEPATH里的
  • 关于工具链:(调节CMAKE_CXX_COMPILER)
    This toolchain is stored in the cache, so if the toolchain changes, the cache must be deleted and rebuilt. Avoid setting the compiler toolchain inside the CMakeLists.txt files.
  • 编译模式:(调节-DCMAKE_BUILD_TYPE:STRING参数)
    (1)Debug,用于打断点调试,相当于GCC的 -O0 -g
    (2)Release,调试好了用于运行,相当于GCC的-O3 -DNDEBUG
    (3)RelWithDebInfo,调好了,自己这边感觉没问题了,给用户测试;如果测试出啥问题,用户那边还能出现debug的信息,相当于GCC的 -O2 -g -DNDEBUG
    (4)MinSizeRel,最小大小发布,相当于-Os -DNDEBUG
    Note that the build types must be passed during the configuration state and are only relevant for single-target generators such as CMake or Ninja. For multi-target generators such as MSVC, they are not used, as the build-system itself can build all build types.
  • 各种目录,不确定的话用message打印出来
    (1) PROJECT_SOURCE_DIR: 当前项目源码路径
    (2)PROJECT_BINARY_DIR: 当前项目输出路径
    (3)CMAKE_SOURCE_DIR: 根项目源码路径
    (4)CMAKE_BINARY_DIR: 根项目输出路径

单一文件到可执行文件的编译

项目组织架构如下
在这里插入图片描述

cmake_minimum_required(VERSION 3.21)
project(
hello_world_standalone # 项目的名字
VERSION 1.0 # 项目的版本号
DESCRIPTION"A simple C++ project" # 项目的描述,可有可无
HOMEPAGE_URL https://github.com/PacktPublishing/CMake-Best-
Practices # 项目的主页,可有可无
LANGUAGES CXX # 项目语言是C++,如果不指定这个变量,默认是C和C++
)
# 指定输出EXE文件的路径,如果不指定默认就在build目录下,
# 下边其实是指定了在Bin目录下,当然需要自己先创建一个
# set(EXECUTABLE_OUTPUT_PATH  ${PROJECT_SOURCE_DIR}/Bin)
add_executable(hello_world)# 可执行文件的名字,不要和项目的名字相同
target_sources(hello_world PRIVATE src/main.cpp)
# 或者 add_executable(hello_world src/main.cpp)
# target_sources 可以指定PRIVATE PUBLIC INTERFACE三个属性,但后两个只对库文件有意义
# PRIVATE属性是指,这个文件只对这个Target有用

配置并编译这个程序(下边这两行可以直接写成.bat或者.sh形式)

# 第一步是 cmake -B build,称为配置阶段(configure),这时只检测环境并生成构建规则
# 会在 build 目录下生成本地构建系统能识别的项目文件(Makefile 或是 .sln)
# 第二步是 cmake --build build,称为构建阶段(build),这时才实际调用编译器来编译代码
cmake -S . -B ./build -G "MinGW Makefiles"
# 在源码目录(就是那个点),用 -B 直接创建 build 目录并生成 ./build/Makefile
# -G属性指定生成器,如果不指定的话在Windows系统上默认用的是MSVC
# https://cmake.org/cmake/help/latest/manual/cmake-generators.7.html
cmake --build ./build --parallel 4 
# 自动调用本地的构建系统在 build 里构建
# --parallel 4代表用4个线程去编译,前边的./build代表Makefile生成的位置
# 也可以指定 --clean-first 属性,用于在重新编译前清理上一次编译的东西

配置过程中的一些Flag
在这里插入图片描述

文件+自己的库

项目组织架构如下
在这里插入图片描述
想通过my_dll.cpp生成数学计算的函数库,利用main.cpp测试这个库是不是好使,如果好使了,把这个库发布到lib_out文件夹里边,方便别人拷走用

  • 外层的CMakeLists.txt
cmake_minimum_required(VERSION 3.16)
project(dll_learn)
# 设置C++的标准是C++20
set(CMAKE_CXX_STANDARD 20)

# 声明引入子项目(目录),声明的这个子目录里一定是有一个CMakeLists.txt的!
add_subdirectory(libs)
# 新增一个可执行文件
add_executable(main main.cpp)
# 增加库文件
target_link_libraries(main PUBLIC my_dll)
# 增加库文件对应的头文件,这样就可以 #include <my_dll.h>
# 通过 target_include_directories 指定的路径会被视为与系统路径等价
target_include_directories(main PUBLIC ./libs)
  • 内层的CMakeLists.txt,子目录的 CMakeLists.txt 里路径名都是相对路径
# 声明这是一个动态库,静态库用STATIC
add_library(my_dll SHARED my_dll.cpp)
# 定义 hellolib 的头文件搜索路径,这里的.表示就在这个目录下
target_include_directories(my_dll PUBLIC .)
# 利用${PROJECT_SOURCE_DIR}/build 定位到CREATE LIBS/build目录
# 同样当测试好之后,可以把这个build改成lib_out
SET(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/build)

配置并编译这个程序

cmake -S . -B ./build -G "MinGW Makefiles"
# 如果只想编译生成库,不想编译生成exe的话,需要指定target
cmake --build ./build --target my_dll --parallel 4 
# 当然如果什么target都不指定,相当于编译所有的target

多文件编译

项目组织架构如下
在这里插入图片描述

# CMake 最低版本号要求
cmake_minimum_required(VERSION 3.22)
# 项目名称, 参数值是 Demo1, 该命令表示项目的名称是 Demo1
project(Demo1)
# 保证中文不出问题
set (CMAKE_CXX_FLAGS  "-fexec-charset=GBK")
# 头文件包含位置
include_directories(${PROJECT_SOURCE_DIR}/Include)

# 指定输出EXE文件的路径
set(EXECUTABLE_OUTPUT_PATH  ${PROJECT_SOURCE_DIR}/Bin)

# 源文件包含位置 
# https://cmake.org/cmake/help/latest/command/aux_source_directory.html
# aux_source_directory(./Src sources)
# aux_source_directory(别的目录 sources)
# 或者用这个
file(GLOB_RECURSE sources CONFIGURE_DEPENDS ${PROJECT_SOURCE_DIR}/Src/*.cpp)
# message("${sources}")
add_executable(Demo1 ${sources})

文件+第三方库(比如Eigen)

Eigen库放在了“D:\Programming\eigen-3.4.0\eigen-3.4.0\Eigen”下边,这时候CMakeLists.txt为

cmake_minimum_required(VERSION 3.16)
project(dll_learn)
set(CMAKE_CXX_STANDARD 20)
# 声明引入子项目(目录)
add_subdirectory(libs)
add_executable(main main.cpp)
target_link_libraries(main PUBLIC my_dll)
target_include_directories(main PUBLIC ./libs)
# 这里的斜杠方向一定要注意!!!
target_include_directories(main PUBLIC "D:/Programming/eigen-3.4.0/eigen-3.4.0/Eigen")
  开发工具 最新文章
Postman接口测试之Mock快速入门
ASCII码空格替换查表_最全ASCII码对照表0-2
如何使用 ssh 建立 socks 代理
Typora配合PicGo阿里云图床配置
SoapUI、Jmeter、Postman三种接口测试工具的
github用相对路径显示图片_GitHub 中 readm
Windows编译g2o及其g2o viewer
解决jupyter notebook无法连接/ jupyter连接
Git恢复到之前版本
VScode常用快捷键
上一篇文章      下一篇文章      查看所有文章
加:2022-08-19 19:26:35  更:2022-08-19 19:30:47 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/18 12:55:59-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码