电子工程师技术服务社区
公告
登录
|
注册
首页
技术问答
厂商活动
正点原子
板卡试用
资源库
下载
文章
社区首页
文章
Cmake学习总结(二)
分 享
扫描二维码分享
Cmake学习总结(二)
cmake
玩转嵌入式Linux
关注
发布时间: 2020-08-06
丨
阅读: 865
大家好,上次给大家分享了第一篇 cmake 文章:cmake学习总结(一),今天继续给大家分享cmake。那么废话就不多说,开始内容分享。 一、用好 Cmake,高兴一整天(甚至...): 1、多个源文件,使用命令 aux_source_directory(dir var): 在上一篇文章最后结尾的时候,有一个问题,就是在同一目录下面,有多个源文件的时候,这个时候你不能都往下面第三条命令里面一直手动添加源文件,那工作效率多低啊: cmake_minimum_required(VERSION 2.8) project(main) add_executable(main main.c test1.c) 于是乎为了解决这种低效率的操作,在 cmake 里面有一条指令可以完全搞定这个问题;不过为了说明问题,在这之前我又添加了两个文件:test2.c 和 test2.h: root@txp-virtual-machine:/home/txp/test# ls 1 cmake_install.cmake main.c test1.h touch1.c CMakeCache.txt CMakeLists.txt Makefile test2.c touch1.h CMakeFiles main test1.c test2.h test2.c内容如下: #include
#include "test2.h" void func1() { printf("i like the cmake\n"); } test2.h内容如下: #ifndef _TEST2_H_ #define _TEST2_H_ void func1(); #endif 最后main.c里面调用了func1函数: #include
#include "test1.h" #include "test2.h" int main(void) { func1(); func(8); printf("TXP嵌入式\n"); return 0; } 接下来我们的重点就来了,在cmake里面可以使用aux_source_directory(dir var)就可以搞定上面效率低的问题,接下来我们在CMakeLists.txt这样操作: cmake_minimum_required(VERSION 2.8) project(main) aux_source_directory(. SRC_LIST) add_executable(main ${SRC_LIST}) 然后再进行编译: root@txp-virtual-machine:/home/txp/test# cmake . -- Configuring done -- Generating done -- Build files have been written to: /home/txp/test root@txp-virtual-machine:/home/txp/test# make Scanning dependencies of target main [ 25%] Building C object CMakeFiles/main.dir/main.c.o [ 50%] Linking C executable main root@txp-virtual-machine:/home/txp/test# ./main i like the cmake the b is 8 TXP嵌入式 说明: aux_source_directory(. SRC_LIST):表示是把当当前目录下的所有源文件都添加到源列表变量里面去,最后用add_executable(main ${SRC_LIST})把所有有用的源文件加工成目标文件main。不过这方法也有他的缺点,就是把当前目录下的源文件都添加到变量SRC_LIST,如果我们不需要一些没有用的文件(只要拿到所需的源文件就行),可以进行这样操作: cmake_minimum_required(VERSION 2.8) project(main) set(SRC_LIST ./main.c ./test1.c ./test2.c ) add_executable(main ${SRC_LIST}) 这样是能够通过编译的: root@txp-virtual-machine:/home/txp/test# cmake . -- Configuring done -- Generating done -- Build files have been written to: /home/txp/test root@txp-virtual-machine:/home/txp/test# make [100%] Built target main 2、在上面的例子中,我们会发现同一目录下源文件比较乱,所以在cmake里面有这样的规则,可以把相同类型以及相关的源文件放到同一个目录,比如说,现在我在test目录下创建test1和test2两个目录文件,并同时把test1.c、test1.h、test2.c、test2.h分别放到这两个目录下去: root@txp-virtual-machine:/home/txp/test# mkdir -p test1 test2 root@txp-virtual-machine:/home/txp/test# ls @ CMakeFiles main test1 test2 1 cmake_install.cmake main.c test1.c test2.c CMakeCache.txt CMakeLists.txt Makefile test1.h test2.h 然后把相关文件一到这两个目录文件下去: root@txp-virtual-machine:/home/txp/test# mv test1.c test1.h test1 root@txp-virtual-machine:/home/txp/test# mv test2.c test2.h test2 root@txp-virtual-machine:/home/txp/test# ls @ CMakeCache.txt cmake_install.cmake main Makefile test2 1 CMakeFiles CMakeLists.txt main.c test1 root@txp-virtual-machine:/home/txp/test# tree ├── cmake_install.cmake ├── CMakeLists.txt ├── main ├── main.c ├── Makefile ├── test1 │ ├── test1.c │ └── test1.h └── test2 ├── test2.c └── test2.h 然后这个时候要修改CMakeLists.txt里面的规则属性了: cmake_minimum_required(VERSION 2.8) project(main) include_directories(test1 test2) aux_source_directory(test1 SRC_LIST) aux_source_directory(test2 SRC_LIST1) add_executable(main main.c ${SRC_LIST} ${SRC_LIST1}) 然后编译输出,也是能够通过的: root@txp-virtual-machine:/home/txp/test# cmake . -- Configuring done -- Generating done -- Build files have been written to: /home/txp/test root@txp-virtual-machine:/home/txp/test# make Scanning dependencies of target main [ 25%] Building C object CMakeFiles/main.dir/main.c.o [ 50%] Building C object CMakeFiles/main.dir/test1/test1.c.o [ 75%] Building C object CMakeFiles/main.dir/test2/test2.c.o [100%] Linking C executable main [100%] Built target main root@txp-virtual-machine:/home/txp/test# ls @ CMakeCache.txt cmake_install.cmake main Makefile test2 1 CMakeFiles CMakeLists.txt main.c test1 root@txp-virtual-machine:/home/txp/test# ./main i like the cmake the b is 8 TXP嵌入式 说明: 这里出现了一个新的命令:include_directories。该命令是用来向工程添加多个指定头文件的搜索路径,路径之间用空格分隔。 其实在实际开发工程中,一般会把源文件放到src目录下,把头文件放入到include文件下,生成的对象文件放入到build目录下,最终输出的elf文件会放到bin目录下,这样让人看起来一目了然,哈哈,更多详细情况可以看下期分解。以上就是今天的学习总结。希望对你有用。
原创作品,未经权利人授权禁止转载。详情见
转载须知
。
举报文章
点赞
(
0
)
玩转嵌入式Linux
关注
评论
(0)
登录后可评论,请
登录
或
注册
相关文章推荐
MK-米客方德推出工业级存储卡
Beetle ESP32 C3 蓝牙数据收发
Beetle ESP32 C3 wifi联网获取实时天气信息
开箱测评Beetle ESP32-C3 (RISC-V芯片)模块
正点原子数控电源DP100测评
DP100试用评测-----开箱+初体验
Beetle ESP32 C3环境搭建
【花雕体验】16 使用Beetle ESP32 C3控制8X32位WS2812硬屏之二
X
你的打赏是对原创作者最大的认可
请选择打赏IC币的数量,一经提交无法退回 !
100IC币
500IC币
1000IC币
自定义
IC币
确定
X
提交成功 ! 谢谢您的支持
返回
我要举报该内容理由
×
广告及垃圾信息
抄袭或未经授权
其它举报理由
请输入您举报的理由(50字以内)
取消
提交