1.单文件
main.cpp文件
#include <iostream>
using namespace std;
int a = 1;
int main() {
int b = 2;
int c = b + a;
cout<<c<<endl;
return 0;
}
同一目录下的CMakeFiles文件
# CMake 最低版本号要求
cmake_minimum_required (VERSION 2.8)
# 项目信息
project (pp)
# 指定生成目标
add_executable(ppout main.cpp)
然后执行cmake .命令,再执行make命令,我们就可以得到目标文件ppout执行文件,如果我们想要修改CMakeLists文件,我们不需要再执行cmake .,我们改完之后直接执行make就行
2. 单目录多文件
目录结构:

main.cpp:
#include <iostream>
#include "source.h"
using namespace std;
int main()
{
int a = 1;
cout<<a<<endl;
f();
return 0;
}
source.cpp:
#include<iostream>
#include"source.h"
using namespace std;
void f()
{
cout<<"hello"<<endl;
}
source.h:
#ifndef SOURCE
#define SOURCE
void f();
class Box{
};
#endif
CMakeLists文件:
# CMake 最低版本号要求
cmake_minimum_required (VERSION 2.8)
# 项目信息
project (pp2)
# 查找当前目录下的所有源文件
# 并将名称保存到 DIR_SRCS 变量
aux_source_directory(. DIR_SRCS)
# 指定生成目标
add_executable(out ${DIR_SRCS})
这里我们并没有像单目录下,指定生成目标后面跟个文件名,当然我们也可以用.cpp文件名加空格的形式来编写,不过这种方式可以帮我们直接扫描我们所设定的目录下的文件名,并且保存在某个变量下,这样我们引用了这个变量,相当于引用了目录下的文件名,不过主目录下一般只有一个main.cpp文件加其他要引用的文件。
3.多文件,多目录
目录结构:

math/CMakeLists.txt:
aux_source_directory(. DIR_HELLO_SRCS)
add_library(MATH ${DIR_HELLO_SRCS})
CMakeLists.txt:
cmake_minimum_required(VERSION 2.8)
project(pp3)
# Add the source in project root directory
aux_source_directory(. DIRSRCS)
# Add header file include directories
include_directories(./ ./math)
# Add block directories
add_subdirectory(math)
# Target
add_executable(helloworld ${DIRSRCS})
target_link_libraries(helloworld MATH)
source.h,source.cpp,main.cpp保持不变
这里我们可以看出,和样例2相比,多了3个函数,第一个include_directories,这个函数的作用是例如我们的main.cpp要include某个目录下的某个文件,我们要#include "文件的详细路径",但是我们一般只想#icnlude "文件名",这时候我们就可以用这个语句,先把他的路径给include了,这样我们main.cpp在导入这个文件的时候就不需要加上详细的文件目录名了,第二个是add_subdirectory,第一个函数只是在导入名字上省略而已,如果我们真想要导入某个目录的文件,我们还是需要add_subdirectory(目录名),第三个是target_link_libraries(),这个函数的作用是见目标文件和库文件进行链接,我们都知道C++编译的时候就是把一个个文件链接起来,最后生成一个可执行文件,这个函数做的就是这一步。
本文详细介绍使用CMake构建C++项目的三种常见场景:单文件项目、单目录多文件项目及多目录项目。涵盖CMakeLists.txt配置、目标生成、源文件搜索、目录包含、子目录添加及库链接等核心概念。
2466

被折叠的 条评论
为什么被折叠?



