如何从0到1写一个非常简单CMakeLists

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})
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值