C++ CMakeLists.txt编写教程_C++项目构建工具CMake入门

CMake通过CMakeLists.txt生成构建配置,基本语法包括指定版本、项目名、源文件编译为可执行文件。支持多源文件、目录结构、头文件路径设置(include_directories)、静态/动态库创建(add_library)与链接(target_link_libraries),并可设C++标准(如C++17)和编译选项(如-Wall)。核心是“目标”概念,对目标设置属性实现灵活构建管理。

c++ cmakelists.txt编写教程_c++项目构建工具cmake入门

CMake 是一个跨平台的构建系统生成工具,广泛用于 C++ 项目中。它不直接编译代码,而是根据 CMakeLists.txt 文件生成适用于不同构建系统的配置文件(如 Makefile、Ninja、Visual Studio 工程等)。掌握如何编写 CMakeLists.txt 是管理 C++ 项目的必备技能。

创建最简单的 CMakeLists.txt

一个最基本的 C++ 项目只需要一个源文件和对应的 CMake 配置文件。

假设你的项目结构如下:

main.cpp
CMakeLists.txt

main.cpp 中写入简单程序:

立即学习“C++免费学习笔记(深入)”;

#include iostream>
int main() {
   std::cout    return 0;
}

然后创建 CMakeLists.txt

cmake_minimum_required(VERSION 3.10)
project(HelloCMake)
add_executable(hello main.cpp)

说明:

cmake_minimum_required:指定所需最低 CMake 版本,避免使用过新特性导致兼容问题。project:定义项目名称,可选地设置语言(默认自动检测为 C 和 C++)。add_executable:将源文件编译成可执行文件,格式为 add_executable(目标名 源文件列表)

添加多个源文件和目录结构

实际项目通常包含多个源文件。例如:

src/
  main.cpp
  utils.cpp
include/
  utils.h
CMakeLists.txt

修改 CMakeLists.txt 如下:

cmake_minimum_required(VERSION 3.10)
project(MyApp)

# 添加头文件搜索路径
include_directories(include)

# 将多个源文件构建成一个可执行文件
add_executable(myapp src/main.cpp src/utils.cpp)

说明:

include_directories:让编译器能找到 #include "utils.h" 这类引用。你可以把所有源文件列在 add_executable 后面,也可以用变量简化:set(SOURCES
  src/main.cpp
  src/utils.cpp
)
add_executable(myapp ${SOURCES})

链接库文件(静态库或动态库)

如果你有独立的工具库,可以将其构建成静态库再链接到主程序。

目录结构示例:

src/main.cpp
lib/utils.cpp
include/utils.h
CMakeLists.txt

更新后的 CMakeLists.txt

cmake_minimum_required(VERSION 3.10)
project(MyApp)

include_directories(include)

# 构建静态库
add_library(myutils STATIC lib/utils.cpp)

# 生成可执行文件
add_executable(myapp src/main.cpp)

# 链接库
target_link_libraries(myapp myutils)

说明:

add_library:创建名为 myutils 的静态库(使用 STATIC),也可用 SHARED 创建动态库。target_link_libraries:指定哪个目标需要链接哪些库。

设置编译选项和标准版本

现代 C++ 项目常使用 C++17 或更高标准。可以在 CMake 中明确指定:

# 设置 C++ 标准
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# 或者针对特定目标设置
target_compile_features(myapp PRIVATE cxx_std_17)

你还可以添加警告选项提升代码质量:

if(CMAKE_CXX_COMPILER_ID STREQUAL “GNU” OR
   CMAKE_CXX_COMPILER_ID MATCHES “Clang”)
  target_compile_options(myapp PRIVATE -Wall -Wextra -pedantic)
endif()

基本上就这些。从简单项目开始,逐步加入子目录、外部依赖、条件编译等功能,CMake 能很好地支持大型 C++ 工程的组织与构建。关键是理解“目标”(target)的概念——每个可执行文件或库都是一个目标,对其设置属性(如包含路径、编译选项、链接库)才是推荐做法。

以上就是C++ CMakeLists.txt编写教程_C++项目构建工具CMake入门的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1486387.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月19日 09:46:57
下一篇 2025年12月15日 16:29:50

相关推荐

  • C++怎么实现一个数据库连接池_C++提升数据库应用性能的常用技术

    数据库连接池通过预创建和复用连接,减少开销,提升C++高并发应用性能。核心组件包括连接管理器、线程安全的连接容器、获取与释放接口及健康检查机制。使用智能指针与RAII封装连接,确保异常安全下的自动回收。通过互斥锁保护连接队列实现线程安全,可选无锁或分段锁优化争用。实际开发中可集成Poco Data等…

    好文分享 2025年12月19日
    000
  • C++二维数组动态分配_C++ new创建二维数组

    答案:C++中动态创建二维数组有两种常用方法。1. 使用二级指针分步分配,先分配行指针数组,再为每行分配列内存,内存不连续,需逐行释放;2. 连续内存分配,通过单次new申请总内存,用下标计算访问元素,内存连续,释放简单。 在C++中,使用new动态创建二维数组有几种常见方式。由于C++不直接支持多…

    2025年12月19日
    000
  • C++多重继承的优缺点_C++菱形继承问题与虚继承解决方案

    多重继承可提升代码复用与建模灵活性,但易引发命名冲突、内存膨胀及菱形继承问题;通过虚继承可确保公共基类唯一实例,避免二义性与资源浪费,但需承担间接访问开销,设计时应优先考虑组合或接口替代方案。 多重继承是C++中一个强大但容易引发问题的特性。它允许一个类从多个基类派生,从而复用多个类的功能。然而,这…

    2025年12月19日
    000
  • C++右值引用与移动语义_C++ std::move与性能优化解析

    右值引用和移动语义通过避免深拷贝提升性能,std::move将左值转为右值引用以触发移动操作,适用于对象转移、函数返回和容器操作,移动后原对象不可再使用其值,移动构造应标记noexcept以优化STL行为。 右值引用和移动语义是C++11引入的核心特性,它们为资源管理带来了显著的性能提升。通过避免不…

    2025年12月19日
    000
  • C++ bitset位集合用法_C++二进制操作与状态压缩技巧

    c++kquote>bitset是C++中用于高效操作固定长度二进制序列的模板类,定义在头文件中,支持初始化、位运算、状态压缩等操作,提供count()、set()、flip()等成员函数,相比手动位运算更安全易读,适用于算法竞赛与集合状态表示。 在C++中,bitset 是一个非常实用的模板…

    2025年12月19日
    000
  • C++中堆和栈的区别_C++内存分区与变量存储位置解析

    栈由系统管理,存储局部变量,空间小、速度快,函数结束自动释放;2. 堆由程序员控制,用new/malloc分配,需手动释放,空间大但易泄漏;3. 全局/静态变量存全局区,字符串常量存常量区,代码存代码区;4. 变量位置取决于定义方式:局部变量在栈,动态创建在堆,全局和static在全局区,成员随对象…

    2025年12月19日
    000
  • C++ ifstream和ofstream区别_C++文件输入流与输出流操作详解

    ifstream用于文件读取,继承自istream,支持>>和getline();ofstream用于文件写入,继承自ostream,使用 在C++中,文件操作主要通过头文件提供的类来实现。其中,ifstream和ofstream是最常用的两个类,分别用于文件的读取和写入。下面详细说明它…

    2025年12月19日
    000
  • c++ string find函数 c++字符串查找子串方法

    std::string的find函数用于查找子串或字符,找到返回索引,未找到返回npos。例如查找”welcome”在字符串中位置为7。可查找字符、指定起始位置,结合循环找所有匹配。相关函数有rfind、find_first_of等,需注意判断npos避免越界。 在C++中,…

    2025年12月19日
    000
  • C++如何定义全局常量_C++ const与extern结合的正确写法

    不能只用 const 定义全局常量,因为 const 全局变量默认具有内部链接,导致每个包含头文件的编译单元都生成独立副本,浪费空间且无法保证地址一致;正确做法是使用 extern const 在头文件声明,在 cpp 文件定义,或在 C++17 起使用 inline constexpr 直接在头文…

    2025年12月19日
    000
  • C++如何获取毫秒级时间戳_C++ time_point_cast的高精度时间获取

    推荐使用std::chrono库获取毫秒级时间戳,通过std::chrono::system_clock::now()获取当前时间点,结合time_since_epoch().count()得到自Unix纪元起的毫秒数,利用time_point_cast可将时间点截断至毫秒精度,适用于日志、定时等场…

    2025年12月19日
    000
  • C++ substring截取字符串_C++ string substr用法详解

    substr函数用于截取字符串,语法为substr(pos, len),从pos开始截取len个字符;若pos超界抛异常,len超限则截至末尾,常用于提取子串、文件名或扩展名。 C++ 中的 substr 函数是处理字符串截取最常用的方法之一,属于 std::string 类的成员函数。它能方便地从…

    2025年12月19日
    000
  • C++怎么使用vcpkg管理第三方库_C++依赖管理与vcpkg使用指南

    vcpkg是微软推出的跨平台C++包管理工具,支持自动下载、编译和集成超2000个第三方库;通过git克隆安装后,可使用vcpkg search/install命令管理库,并通过CMake工具链文件集成到项目中;推荐在项目根目录创建vcpkg.json声明依赖,实现团队协作的“开箱即用”;支持清理缓…

    2025年12月19日
    000
  • c++怎么使用pybind11来封装库给Python调用_c++与Python混合编程接口开发教程

    使用pybind11可将C++代码封装为Python模块,通过编写绑定代码并编译为共享库,实现高效调用。首先安装pybind11并获取头文件路径,然后在C++中定义函数和类,并使用PYBIND11_MODULE宏导出;接着通过g++或CMake编译生成模块文件;最后在Python中直接导入使用。支持…

    2025年12月19日
    000
  • C++ size_t是什么数据类型_C++跨平台移植性编程

    size_t是C++中用于表示对象大小的无符号类型,定义于等头文件,实际类型依平台而定,32位系统常为unsigned int,64位系统常为unsigned long long,确保能表示最大对象尺寸;它与sizeof操作符返回类型一致,避免类型警告,广泛用于std::vector::size()…

    2025年12月19日
    000
  • C++ pair用法详解_C++ pair结构体与make_pair

    pair是C++中用于组合两个数据的模板结构体,定义于头文件,包含first和second成员;2. 可通过直接构造、花括号、make_pair或赋值方式初始化;3. make_pair能自动推导类型,简化代码;4. 在map中pair作为键值对存储,遍历时访问first和second;5. pai…

    2025年12月19日
    000
  • C++如何将string转char*_C++ c_str()函数使用注意事项

    使用c_str()可将std::string转为const char*,返回指向内部数据的只读指针,其有效性依赖原字符串生命周期,不可修改内容或在对象销毁后使用。 在C++中,将std::string转换为const char*最常用的方法是使用c_str()函数。这个函数返回一个指向以空字符结尾的…

    2025年12月19日
    000
  • c++ inline内联函数 c++ inline优缺点分析

    内联函数通过将函数体直接插入调用处来提升短小频繁函数的执行效率,减少调用开销,支持头文件定义且类内成员函数默认内联,但会增加代码体积、可能不被编译器采纳、影响调试且修改需重新编译,建议用于简短高频函数,避免滥用。 在C++中,inline关键字用于建议编译器将函数体直接插入到调用处,而不是进行常规的…

    2025年12月19日
    000
  • C++如何根据分隔符拆分string_C++ getline指定分隔符用法技巧

    使用std::getline配合stringstream可实现C++字符串拆分,通过指定分隔符循环读取子串,支持单字符分隔、过滤空串及前后空白处理,扩展方法可替换多分隔符为统一字符后拆分,适用于CSV解析等场景。 在C++中,根据分隔符拆分字符串是一个常见需求,比如处理CSV数据、解析配置项等。虽然…

    2025年12月19日
    000
  • C++如何判断文件是否存在_C++ filesystem库与传统方法的对比

    C++17 filesystem库提供跨平台、安全且易读的文件存在性判断方法,如fs::exists;传统方法如fopen和access则受限于可移植性和安全性,易受TOCTOU问题影响,现代开发应优先选用filesystem。 判断文件是否存在是编程中常见的需求。在C++中,有多种方式可以实现这一…

    2025年12月19日
    000
  • C++23的std::mdspan是什么_C++表示多维数组的非拥有型视图

    std::mdspan是C++23引入的多维数组视图,1. 不拥有内存,仅提供对现有数据的安全高效访问;2. 支持静态或动态维度,如std::dynamic_extent;3. 可配置布局,如行优先、列优先或步幅访问;4. 用于科学计算等场景,避免手动偏移计算。 std::mdspan 是 C++2…

    2025年12月19日
    000

发表回复

登录后才能评论
关注微信