Linux中CMake的使用2-同目录下多个源文件

举报
码农爱学习 发表于 2022/02/13 11:32:58 2022/02/13
【摘要】 上篇文章介绍了编写CMakeLists.txt的最基础用法——只有一个源文件的情况。 本篇继续介绍,在同一目录下有多个源文件时如何编写CMakeLists.txt。

上篇文章介绍了编写CMakeLists.txt的最基础用法——只有一个源文件的情况。

本篇继续介绍,在同一目录下有多个源文件时如何编写CMakeLists.txt。

1 一组文件的情况

先来看下面这种情况:除了main.c以外,只多出来一组源文件(1个.c文件+1个.h文件)。

1.1 编写C源文件

以一个简单的两数相加为例,代码如下:

main.c

#include <stdio.h>
#include "sum.h"
​
int main(void)
{
    int a = 1;
    int b = 2;
    printf("a=%d, b=%d\n", a, b);
    printf("a+b=%d\n", sum(a, b));
​
    return 0;
}

sum.c

#include "sum.h"
​
int sum(int a, int b)
{
    return (a + b);
}

sum.h

#ifndef _SUM_H_
#define _SUM_H_
​
int sum(int a, int b);
​
#endif

1.2 编写CMakeLists.txt

CMakeLists.txt的内容,和上一篇介绍的对单个文件进行编译的情况基本一样:

cmake_minimum_required (VERSION 2.8)
​
project (sum_test)
​
add_executable(sum_test main.c sum.c)

注意,同个目录有多个源文件,CMakeLists的主要区别是在add_executable继续增加需要编译的c文件。

1.3 编译测试

在当前目录执行cmake指令:

cmake .

cmake后面的点,用来告诉CMake工具在当前目录中搜寻CMakeLists.txt文件。

自动生成makefile文件之后,再使用make指令编译源码:

make

最后可以看到程序的运行结果。

2 多组文件的情况

再来看下面这种情况:除了main.c以外,还多出来两组源文件(sum.c+sum.h、sub.c+sub.h)。

2.1 编写C源文件

测试代码仍很简单,sum的函数和上面一样,sub函数以及main的代码如下:

main.c

#include <stdio.h>
#include "sum.h"
#include "sub.h"
​
int main(void)
{
    int a = 1;
    int b = 2;
    printf("a=%d, b=%d\n", a, b);
    printf("a+b=%d\n", sum(a, b));
    printf("a-b=%d\n", sub(a, b));
​
    return 0;
}

sub.c

#include "sub.h"
​
int sub(int a, int b)
{
    return (a - b);
}

sub.h

#ifndef _SUB_H_
#define _SUB_H_
​
int sub(int a, int b);
​
#endif

注:sum.c和sum.h和之前的一样

2.2 编写CMakeLists.txt

注意CMakeLists.txt和之前的区别:

cmake_minimum_required (VERSION 2.8)
​
project (sum_sub_test)
​
aux_source_directory(. SRC_LIST)
​
add_executable(sum_sub_test main.c ${SRC_LIST})

这里使用aux_source_directory把当前目录(.)下的所有源文件存列表存放到变量SRC_LIST

然后在add_executable里调用SRC_LIST,这样,当有再多的源文件,CMakeLists也不需要改了

2.3 编译测试

按照之前的编译测试流程进行编译测试,结果如下:

3 总结

本篇介绍了同一目录下有多个源文件时如何编写CMakeLists.txt。

对于同个文件夹下有多个源文件,主要还是修改add_executable这句,将需要用到的C文件添加进去即可:

cmake_minimum_required (VERSION 2.8)
​
project (hello)
​
add_executable(sum_test main.c sum.c)

另外,还可以借助aux_source_directory把指定目录下的所有源文件存列表存放到变量中,这样就不受文件数量的影响:

aux_source_directory(. SRC_LIST)
add_executable(sum_sub_test main.c ${SRC_LIST})

总的来说,一个新的知识点就是aux_source_directory的使用。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。