CMake实用指南第三节:多个源文件和头文件

第三节:多个源文件和头文件

本节项目代码在:https://github.com/HuPengsheet/use_cmake/tree/master/course_03

​ 在实际的项目中,我们往往有许多的头文件和源文件,所有的头文件会放在一个目录下,所有的源文件会放在一个目录下。如下所示是示例代码的结构

.
├── CMakeLists.txt
├── include
│ └── my_math.hpp
└── src
├── add.cpp
├── main.cpp
└── sub.cpp

​ 以下是每个文件里的代码

//my_math.hpp

#ifndef MY_MATH_HPP
#define MY_MATH_HPP

int add(int a,int b);
int sub(int a,int b);

#endif

​ 在my_math.hpp头文件里申明了两个函数

//add.cpp

#include"my_math.hpp"

int  add(int a,int b){
    return a+b;
}


//sub.cpp
#include"my_math.hpp"

int sub(int a,int b){
    return a-b;
}

在add.cpp和sub.cpp里分别实现了头文件里申明的两个函数,加法函数和减法函数。

我们在main函数调调用这两个函数

#include<iostream>
#include"my_math.hpp"
using namespace std;
int main(){
    cout<<"3+2="<<add(2,3)<<endl;
    cout<<"3-2="<<sub(3,2)<<endl;

}

接下来是CMakeLists.txt

cmake_minimum_required(VERSION 3.10)
project(course_03)

set(CMAKE_CXX_STANDARD 11)  # 将 C++ 标准设置为 C++ 11
set(CMAKE_CXX_STANDARD_REQUIRED ON)  # C++ 11 是强制要求,不会衰退至低版本
set(CMAKE_CXX_EXTENSIONS OFF)  # 禁止使用编译器特有扩展

if(NOT CMAKE_BUILD_TYPE)
	message(WARNING "NOT SET CMAKE_BUILD_TYPE")
    set(CMAKE_BUILD_TYPE "Release")
endif()

aux_source_directory(src SRC)
#message(STATUS ${SRC})
set(INCLUDE "include")

add_executable(run ${SRC})
target_include_directories(run PRIVATE ${INCLUDE})

使用aux_source_directory获取所有源文件

​ 相较于之前编写的CMakeLists.txt,在这里我们通过aux_source_directory命令获取文件夹中的所有源文件名称

aux_source_directory(<dir> <variable>)

这个函数的第一个参数是目录名称,第二个是变量的名字,用来存放搜索到的文件名。

aux_source_directory(src SRC)

​ 也就是,将src下面所有cpp源文件的名字,记录到变量SRC中,然后再通过${SRC}引用变量,避免我们一个个手动写上所有的源文件名称。同时我们也可以使用message(STATUS ${SRC}),将变量的值打印出来,下面是打印结果。

-- src/add.cpp src/main.cpp src/sub.cpp

​ 可以看到SRC变量下记录的是源文件的相对路径

为目标添加文件包含路径

CMakeLists.txt中有这么几行代码

set(INCLUDE "include")
add_executable(run ${SRC})
target_include_directories(run PRIVATE ${INCLUDE})

​ 我们在前面提到过,add_executable(run ${SRC})中的run是一个cmake目标,target_include_directories是给run目标添加包含目录这个属性。在这次的代码结构中,我们有一个头文件,my_math.hpp在include目录下,如果我们不指明run目标的包含目录的话我们在执行make命令的时候就会报如下错误:
在这里插入图片描述

​ 也就是目标,找不到头文件放哪了。另外PRIVATE是指明作用域的,我们会在下一节做详细介绍。

​ 关于cmake中的目标和目标的属性,我们会在下一节详细介绍。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值