现代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");
}
-
逐个添加即可:
add_execute(main) target_sources(main PUBLIC main.cpp other.cpp)
-
使用变量来存储:
add_execute(main) set(sources main.cpp other.cpp) target_source(main PUBLIC ${sources})
-
建议把头文件也加上,这样在 VS 里可以出现在“Header Files”一栏
add_execute(main) set(sources main.cpp other.cpp other.h) target_source(main PUBLIC ${sources})
-
使用 GLOB 自动查找当前目录下指定扩展名的文件,实现批量添加源文件
add_execute(main) file(GLOB sources *.cpp *.h) target_source(main PUBLIC ${sources})
-
启用 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 目录下。