当前位置: 首页 > article >正文

现代CMake高级教程 - 第 1 章:添加源文件

双笙子佯谬老师的【公开课】现代CMake高级教程课程笔记

第 1 章:添加源文件

例 1

一个 .cpp 源文件用于测试

// main.cpp 
#include <cstdio>

int main()
{
	printf("Hello world!\n");
}

CMake 中添加一个可执行文件作为构建目标

//CMakeLists.txt
add_executable(main main.cpp)

另一种方式:先创建目标,稍后再添加源文件

add_executable(main)
target_sources(main PUBLIC main.cpp)

例 2

如果有多个源文件呢?

$ls 
main.cpp	other.cpp	other.h
// main.cpp 
#include "other.h"

int main()
{
	say_hello();
}
// other.h
#pragma once 

void say_hello();
#include "other.h"
#include <cstdio>

void say_hello()
{
	printf("Hello form other cpp!\n");
}
  1. 逐个添加即可:

    add_execute(main)
    target_sources(main PUBLIC main.cpp other.cpp)
    
  2. 使用变量来存储:

    add_execute(main)
    set(sources main.cpp other.cpp)
    target_source(main PUBLIC ${sources})
    
  3. 建议把头文件也加上,这样在 VS 里可以出现在“Header Files”一栏

    add_execute(main)
    set(sources main.cpp other.cpp other.h)
    target_source(main PUBLIC ${sources})
    
  4. 使用 GLOB 自动查找当前目录下指定扩展名的文件,实现批量添加源文件

    add_execute(main)
    file(GLOB sources *.cpp *.h)
    target_source(main PUBLIC ${sources})
    
  5. 启用 CONFIGURE_DEPENDS 选项,当添加新文件时,自动更新变量

    add_execute(main)
    file(GLOB sources CONFIGURE_DEPENDS *.cpp *.h)
    target_source(main PUBLIC ${sources})
    

例 3

如果源码放在子文件夹里怎么办?

$tree
.
├── CMakeLists.txt
├── main.cpp
└── mylib
    ├── other.cpp
    └── other.h

必须把路径名和后缀名的排列组合全部写出来吗?感觉好麻烦

add_executable(main)
file(GLOB sources CONFIGURE_DEPENDS *.cpp *.h mylib/*.cpp mylib/*.h)
target_sources(main PUBLIC ${sources})

大可不必!用 aux_source_directory,自动搜集需要的文件后缀名

add_executable(main)
aux_source_directory(. sources)
aux_source_directory(mylib sources)
target_sources(main PUBLIC ${sources})

进一步:GLOB_RECURSE 了解一下!能自动包含所有子文件夹下的文件

add_executable(main)
file(GLOB_RECURSE source CONFIGURE_DEPENDS *.cpp *.h)
target_sources(main PUBLIC ${sources})

GLOB_RECURSE 的问题:会把 build 目录里生成的临时 .cpp 文件也加进来
解决方案:要么把源码统一放到 src 目录下,要么要求使用者不要把 build 放到和源码同一个目录里,我个人的建议是把源码放到 src 目录下。


http://www.kler.cn/news/16855.html

相关文章:

  • PowerJob基本概念
  • PHP学习笔记第一天
  • PHP+vue大学生心理健康评价和分析系统8w3ff
  • 每天一点C++——杂记
  • QT文本编辑与排版包含字体相关设置、段落对齐与排序方式
  • 树的刷题,嗝
  • 如果用上以下几种.NET EF Core性能调优,那么查询的性能会飙升
  • bash的进程与欢迎讯息自定义
  • C++命名空间的定义以及使用
  • C++煞笔笔记
  • 功能齐全的 DIY ESP32 智能手表设计之原理图讲解一
  • python实战应用讲解-【numpy数组篇】实用小技巧(九)(附python示例代码)
  • 这一篇LiveData掉不掉价(使用+粘性事件解决)
  • 07 Kubernetes 网络与服务管理
  • 项目沟通管理和干系人管理
  • 如何学习数据结构和算法
  • 《智能手机心率和呼吸率测量算法的前瞻性验证》阅读笔记
  • 23年5月高项备考学习笔记 —— 信息系统治理
  • NLP实战:基于Pytorch的文本分类入门实战
  • PS磨皮插件portraiture最新版磨皮工具
  • 【Python习题集3】常用数据结构习题
  • vcruntime140_1.dll丢失的解决方法
  • 3个经典线程同步问题
  • 用ChatGPT通过WebSocket开发一个交互性的五子棋微信小程序(二)
  • ArduPilot之开源代码基础知识Threading概念
  • Vue3通透教程【十四】TS复杂类型详解(一)
  • MATLAB函数封装2:QT调用封装函数
  • 至少要吃掉多少糖果
  • HPDA的资料
  • 荔枝派Zero(全志V3S)制作 IMG 镜像文件