1. 前言
[废话]使用Linux进行编程开发,怎么能不会编写CMakelist呢,要不然自己创造的code都不能编译、运行、调试。
对于我们这种非计算机科班出身的人来讲,程序编译链接等底层原理都不是很清楚,再加上CmakeList一些语法、关键字不好记也不好理解,但是不能因为难而望而却步。
对于像我这样的实用为主的攻城狮来讲,功能简单够用就行,学习一些简单的语法,够平时调试算法就行,这样难度也就小一些了。
如果想了解一点g++编译,可以戳这里: g++ 手动编译程序
关于cmake和g++的安装,请另行百度。
2.举个例子
2.1 需要被编译的代码
代码的组织形式如下,main.cpp调用了add、multi两个目录下的程序。
各个文件的代码如下
main.cpp
#include "add.hpp"
#include "iostream"
#include "multi.hpp"
using namespace std;
int main(int argc, char** argv) {
int a, b;
a = 10;
b = 13;
std::cout << "a + b = " << add(a, b) << endl;
std::cout << "a * b = " << multi(a, b) << endl;
return 0;
}
add.cpp
#include "add.hpp"
int add(int a, int b) {
int ret;
ret = a + b;
return (a + b);
}
add.hpp
int add(int a, int b);
multi.cpp
#include "multi.hpp"
int multi(int a, int b) {
int ret;
ret = a * b;
return ret;
}
multi.hpp
int multi(int a, int b);
2.2 开始编写CMakelists.txt
在编写CMakelists.txt,首先先想一下,编译程序需要告诉编译器哪些信息,例如:
- hpp文件信息
- cpp文件信息
- 编译后可执行文件的名称
那后面就对照上面的问题进行解答。
2.2.1 hpp文件信息
使用include_directories,可以获得头文件所在的路径
# hpp文件的信息
include_directories (${PROJECT_SOURCE_DIR}/add)
include_directories (${PROJECT_SOURCE_DIR}/multi)
在cmake中,“PROJECT_SOURCE_DIR”为CMakeLists.cpp所在的路径。
2.2.2 cpp文件信息
使用aux_source_directory,可以获得源文件所在的路径。
与头文件hpp处理不一样,源文件的信息需要被存储在DIR_SRCS变量中,供后面使用,这个变量的名称可以自定义。
# 源文件信息
# add目录下的cpp
aux_source_directory(${PROJECT_SOURCE_DIR}/add DIR_SRCS)
# multi目录下的cpp
aux_source_directory(${PROJECT_SOURCE_DIR}/multi DIR_SRCS)
# 根目录下的cpp,也就是main.cpp
aux_source_directory(${PROJECT_SOURCE_DIR} DIR_SRCS)
2.2.3 可执行文件的名称
#生成可执行程序 语法:add_executable(可执行程序名 要编译的cpp)
add_executable(Tutorial main.cpp ${DIR_SRCS})
上面的DIR_SRCS包含了两个文件目录下的cpp和main.cpp,Tutorial是生成可执行文件的名称。
到此为止一个最精简的CMakeLists.txt编写完成了。
2.3 编译CMakeLists.txt
CMakeLists.txt不能直接使用,需要使用cmake编译后生成Makefile才能make使用。有两种方法可以编译,推荐使用第2种:
1)直接在CMakeLists.txt的当前目录执行cmake;
2)新建一个文件夹build,cd bulid 后执行 cmake …
使用第2种方法的好处是cmake生成的临时文件会存放在build目录下,避免了与开发文件混杂在一起。
mkdir build
cd build
cmake ..
make
2.4 其它
CMakeLists.txt中一般还会增加以下信息:
# cmake 的最小版本要求
cmake_minimum_required(VERSION 3.12)
# 这个CMakeLists管理的工程名称
project(cmakeTest)
所以完整的CMakeLists.txt如下。
# cmake 的最小版本要求
cmake_minimum_required(VERSION 3.12)
# 这个CMakeLists管理的工程名称
project(cmakeTest)
# hpp文件的信息
include_directories (${PROJECT_SOURCE_DIR}/add)
include_directories (${PROJECT_SOURCE_DIR}/multi)
# 源文件信息
# add目录下的cpp
aux_source_directory(${PROJECT_SOURCE_DIR}/add DIR_SRCS)
# multi目录下的cpp
aux_source_directory(${PROJECT_SOURCE_DIR}/multi DIR_SRCS)
# 根目录下的cpp,也就是main.cpp
aux_source_directory(${PROJECT_SOURCE_DIR} DIR_SRCS)
#生成可执行程序 语法:add_executable(可执行程序名 要编译的cpp)
add_executable(Tutorial ${DIR_SRCS})