cmake:同一目录下多个源文件
此文为:轻松入门cmake系列教程
·
- 此文为:轻松入门cmake系列教程
- 前文为: cmake:Hello cmake
接下来进入稍微复杂的例子:在同一个目录下有多个源文件。
第一个实验
实践
在之前的目录下添加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_LIST | aux_source_directory(. SRC_LIST) |
add_executable | 把指定目录下所有的源文件存储在一个变量中 | add_executable(main ${SRC_LIST}) |
更多推荐
已为社区贡献10条内容
所有评论(0)