cmake:同一目录下多个源文件

1059 篇文章 286 订阅

接下来进入稍微复杂的例子:在同一个目录下有多个源文件。

第一个实验

实践

在之前的目录下添加2个文件,testFunc.c和testFunc.h。添加完后整体文件结构如下:
在这里插入图片描述
testFunc.c内容如下:

/*
** testFunc.c
*/

#include <stdio.h>
#include "testFunc.h"

void func(int data)
{
	printf("data is %d\n", data);
}

testFunc.h内容如下:

/*
** testFunc.h
*/

#ifndef _TEST_FUNC_H_
#define _TEST_FUNC_H_

void func(int data);

#endif

修改main.c,调用testFunc.h里声明的函数func():

#include <stdio.h>

#include "testFunc.h"

int main(void)
{
	func(100);

	return 0;
}

修改CMakeLists.txt,在add_executable的参数里把testFunc.c加进来

cmake_minimum_required (VERSION 2.8)

project (demo)

add_executable(${PROJECT_NAME} 
	main.c 
	testFunc.c
	)

然后重新执行cmake生成Makefile并运行make,

在这里插入图片描述

然后运行重新生成的elf文件demo:

在这里插入图片描述

推论

(1)可以类推,如果在同一目录下有多个源文件,那么只要在add_executable里把所有源文件都添加进去就可以了,比如:

add_executable(${PROJECT_NAME} 
	main.c 
	testFunc.c
	testFunc1.c
	testFunc2.c
	testFunc3.c
	)

(2) 但是如果有一百个源文件,再这样做就有点坑了,无法体现cmake的优越性,cmake提供了一个命令可以把指定目录下所有的源文件存储在一个变量中,这个命令就是:

 aux_source_directory(dir var)
  • 第一个参数dir是指定目录
  • 第二个参数var是用于存放源文件列表的变量。

用法可以参见第二个实验

第二个实验

我们在main.c所在目录下再添加2个文件,testFunc1.c和testFunc1.h。添加完后整体文件结构如下
在这里插入图片描述
testFunc1.c如下:

/*
** testFunc1.c
*/

#include <stdio.h>
#include "testFunc1.h"

void func1(int data)
{
	printf("data is %d\n", data);
}

testFunc1.h如下:

/*
** testFunc1.h
*/

#ifndef _TEST_FUNC1_H_
#define _TEST_FUNC1_H_

void func1(int data);

#endif

再修改main.c,调用testFunc1.h里声明的函数func1():

#include <stdio.h>

#include "testFunc.h"
#include "testFunc1.h"

int main(void)
{
	func(100);
	func1(200);

	return 0;
}

修改CMakeLists.txt

  • 使用aux_source_directory把当前目录下(.表示当前目录)的源文件存列表存放到变量SOURCES里
  • 然后在add_executable里调用SOURCES(注意调用变量时的写法)
cmake_minimum_required (VERSION 2.8)

project (demo)

aux_source_directory(. SOURCES)

add_executable(${PROJECT_NAME}  ${SOURCES})

再次执行cmake和make,并运行main
在这里插入图片描述

可以看到运行成功了。

aux_source_directory()也存在弊端,它会把指定目录下的所有源文件都加进来,可能会加入一些我们不需要的文件,此时我们可以使用set命令去新建变量来存放需要的源文件,如下:

cmake_minimum_required (VERSION 2.8)

project (demo)

set( SOURCES
	 ./main.c
	 ./testFunc1.c
	 ./testFunc.c)

add_executable(${PROJECT_NAME}  ${SOURCES})

  • 两者效果是一样的

在这里插入图片描述

总结

命令说明示例
set新建变量来存放需要的源文件set( SOURCES ./main.c ./testFunc1.c ./testFunc.c)
aux_source_directory把当前目录下的源文件存列表存放到变量SRC_LISTaux_source_directory(. SRC_LIST)
add_executable把指定目录下所有的源文件存储在一个变量中add_executable(main ${SRC_LIST})
  • 6
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值