登录发现更多内容
首页
分类
发帖
账号
自动登录
找回密码
密码
登录
立即注册
立即登录
立即注册
其他登录
QQ
微信
首页
Portal
求助问答
Xiuno资源
Xiuno教程
Xiuno插件
Xiuno主题
休闲茶馆
定制主题
产品教程
BBS
求助问答
Xiuno资源
Xiuno教程
Xiuno插件
Xiuno主题
休闲茶馆
定制主题
开发资料
求助问答
Xiuno资源
Xiuno教程
Xiuno插件
Xiuno主题
休闲茶馆
定制主题
样品购买
求助问答
Xiuno资源
Xiuno教程
Xiuno插件
Xiuno主题
休闲茶馆
定制主题
IoT云平台
求助问答
Xiuno资源
Xiuno教程
Xiuno插件
Xiuno主题
休闲茶馆
定制主题
GitHub
求助问答
Xiuno资源
Xiuno教程
Xiuno插件
Xiuno主题
休闲茶馆
定制主题
技术博客
求助问答
Xiuno资源
Xiuno教程
Xiuno插件
Xiuno主题
休闲茶馆
定制主题
搜索
搜索
热搜:
LoRa
ESP8266
安信可
本版
帖子
用户
请
登录
后使用快捷导航
没有账号?
立即注册
每日签到
任务
广播
导读
排行榜
设置
我的收藏
退出
10
0
1
首页
技术杂谈
›
【转载】CMakeLists详解
1
2
/ 2 页
下一页
返回列表
【转载】CMakeLists详解
[ 复制链接 ]
发布帖子
WT_0213
论坛元老
133
主题
1990
回帖
2万
积分
论坛元老
勤劳的打工人
论坛元老, 积分 21747, 距离下一级还需 9978252 积分
论坛元老, 积分 21747, 距离下一级还需 9978252 积分
积分
21747
私信
10人留言
楼主
技术杂谈
4830
10
2024-1-19 11:34:42
## CMakeLists详解 ### 一、CMake简介 cmake 是一个跨平台、开源的构建系统。它是一个集软件构建、测试、打包于一身的软件。它使用与平台和编译器独立的配置文件来对软件编译过程进行控制。 ### 二、常用命令 #### 1. 指定cmake最小版本 > cmake_minimum_required(VERSION 3.0) 这行命令是可选的,我们可以不写这句话,但在有些情况下,如果 CMakeLists.txt 文件中使用了一些高版本 `cmake` 特有的一些命令的时候,就需要加上这样一行,提醒用户升级到该版本之后再执行 cmake。 #### 2. 设置项目名称 > project(demo) 这个命令不是强制性的,但最好都加上。它会引入两个变量 `demo_BINARY_DIR` 和 `demo_SOURCE_DIR`,同时,`cmake` 自动定义了两个等价的变量 `PROJECT_BINARY_DIR` 和 `PROJECT_SOURCE_DIR`。 #### 3. 设置编译类型 > add_executable(demo demo.cpp) # 生成可执行文件 > add_library(common STATIC util.cpp) # 生成静态库 > add_library(common SHARED util.cpp) # 生成动态库或共享库 add\_library 默认生成是静态库,通过以上命令生成文件名字, 在 Linux 下是: demo libcommon.a libcommon.so 在 Windows 下是: demo.exe common.lib common.dll #### 4. 指定编译包含的源文件 ##### 4.1 明确指定包含哪些源文件 > add_library(demo demo.cpp test.cpp util.cpp) ##### 4.2 搜索所有的cpp文件 > aux_source_directory(. SRC_LIST) # 搜索当前目录下的所有.cpp文件 > add_library(demo ${SRC_LIST}) `aux_source_directory(dir VAR)` 意思是发现一个目录 `dir` 下所有的源代码文件,并将列表存储在一个变量 `VAR` 中。 ##### 4.3 自定义搜索规则 > file(GLOB SRC\_LIST "\*.cpp" "protocol/\*.cpp") > add\_library(demo \${SRC\_LIST}) > 或者 > file(GLOB SRC\_LIST "\*.cpp") > file(GLOB SRC\_PROTOCOL\_LIST "protocol/\*.cpp") > add\_library(demo \${SRC\_LIST} \${SRC\_PROTOCOL\_LIST}) > 或者 > aux\_source\_directory(. SRC\_LIST) > aux\_source\_directory(protocol SRC\_PROTOCOL\_LIST) > add\_library(demo \${SRC\_LIST} \${SRC\_PROTOCOL\_LIST}) 对于收集文件的指令 > file(GLOB files LIST_DIRECTORIES false *) 其中,GLOB命令将所有匹配
(可选,假如不写,毛都匹配不到)的文件挑选出来,默认以字典顺序排序。 5. 查找指定的库文件 find_library(VAR name path) 查找到指定的预编译库,并将它的路径存储在变量中。默认的搜索路径为 cmake 包含的系统库,因此如果是 NDK 的公共库只需要指定库的 name 即可。 > find\_library( log-lib log ) > Sets the name of the path variable. > Specifies the name of the NDK library that you want CMake to locate. 类似的命令还有 `find_file()` 、 `find_path()` 、 `find_program()` 、 `find_package()`。 #### 6. 设置包含的目录 > include_directories( > ${CMAKE_CURRENT_SOURCE_DIR} > ${CMAKE_CURRENT_BINARY_DIR} > ${CMAKE_CURRENT_SOURCE_DIR}/include > ) Linux 下还可以通过如下方式设置包含的目录 > set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -I${CMAKE_CURRENT_SOURCE_DIR}") #### 7. 设置链接库搜索目录 > link_directories(${CMAKE_CURRENT_SOURCE_DIR}/libs) Linux 下还可以通过如下方式设置包含的目录 > set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${CMAKE_CURRENT_SOURCE_DIR}/libs") #### 8. 设置需要链接的库 在cmake语法中,`link_libraries`和 `target_link_libraries`是很重要的两个链接库的方式,虽然写法上很相似,但是功能上有很大区别: 1.link_libraries用在add_executable之前,target_link_libraries用在add_executable之后。 2.link_libraries用来链接静态库,target_link_libraries用来链接导入库,即按照header file + .lib + .dll方式隐式调用动态库的.lib库。 > link\_libraries(\${log-lib}) > \${log-lib}无需含有文件后缀,下同 > target\_link\_libraries(demo \${log-lib} ) > 目标库 > 目标库需要链接的库 > log-lib 是上面 find\_library 指定的变量名 在 Windows 下,系统会根据链接库目录,搜索 `xxx.lib` 文件,Linux 下会搜索 `xxx.so` 或者 `xxx.a` 文件,如果都存在会优先链接动态库(so 后缀)。 ##### 8.1 指定链接动态库或静态库 > target_link_libraries(demo libface.a) # 链接libface.a > target_link_libraries(demo libface.so) # 链接libface.so ##### 8.2 指定全路径 > target_link_libraries(demo ${CMAKE_CURRENT_SOURCE_DIR}/libs/libface.a) > target_link_libraries(demo ${CMAKE_CURRENT_SOURCE_DIR}/libs/libface.so) ##### 8.3 指定链接多个库 > target_link_libraries(demo > ${CMAKE_CURRENT_SOURCE_DIR}/libs/libface.a > boost_system.a > boost_thread > pthread) #### 9. 设置变量 ##### 9.1 set 直接设置变量的值 > set(SRC_LIST main.cpp test_fun.cpp) > add_executable(demo ${SRC_LIST}) ##### 9.2 set 追加设置变量的值 > set(SRC_LIST main.cpp) > set(SRC_LIST ${SRC_LIST} test.cpp) > add_executable(demo ${SRC_LIST}) ##### 9.3 list 追加或者删除变量的值 > set(SRC_LIST main.cpp) > > SRC\_LIST中追加 test\_fun.cpp > list(APPEND SRC\_LIST test\_fun.cpp) > > SRC\_LIST中删除 main.cpp > list(REMOVE\_ITEM SRC\_LIST main.cpp) > add\_executable(demo \${SRC\_LIST}) #### 10. 条件控制 ##### 10.1 if…elseif…else…endif * 逻辑判断和比较: * > if (expression):expression 不为空(0,N,NO,OFF,FALSE,NOTFOUND)时为真 > if (not exp):与上面相反 > if (var1 AND var2) > if (var1 OR var2) > if (COMMAND cmd):如果 cmd 确实是命令并可调用为真 > if (EXISTS dir) if (EXISTS file):如果目录或文件存在为真 > if (file1 IS_NEWER_THAN file2):当 file1 比 file2 新,或 file1/file2 中有一个不存在时为真,文件名需使用全路径 > if (IS_DIRECTORY dir):当 dir 是目录时为真 > if (DEFINED var):如果变量被定义为真 > if (var MATCHES regex):给定的变量或者字符串能够匹配正则表达式 regex 时为真,此处 var 可以用 var 名,也可以用 ${var} > if (string MATCHES regex) > 数字比较: * > if (variable LESS number):LESS 小于 > if (string LESS number) > if (variable GREATER number):GREATER 大于 > if (string GREATER number) > if (variable EQUAL number):EQUAL 等于 > if (string EQUAL number) > 字母表顺序比较: * > if (variable STRLESS string) > if (string STRLESS string) > if (variable STRGREATER string) > if (string STRGREATER string) > if (variable STREQUAL string) > if (string STREQUAL string) > **示例:** ``` if(MSVC) set(LINK_LIBS common) else() set(boost_thread boost_log.a boost_system.a) endif() target_link_libraries(demo ${LINK_LIBS}) # 或者 if(UNIX) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -fpermissive -g") else() add_definitions(-D_SCL_SECURE_NO_WARNINGS D_CRT_SECURE_NO_WARNINGS -D_WIN32_WINNT=0x601 -D_WINSOCK_DEPRECATED_NO_WARNINGS) endif() if(${CMAKE_BUILD_TYPE} MATCHES "debug") ... else() ... endif() ``` ##### 10.2 while…endwhile > while(condition) > ... > endwhile() ##### 10.3 foreach…endforeach > #start 表示起始数,stop 表示终止数,step 表示步长 > foreach(loop_var RANGE start stop [step]) > ... > endforeach(loop_var) **示例:** ``` foreach(i RANGE 1 9 2) message(${i}) endforeach(i) 输出:13579 ``` #### 11. 打印信息 > message(${PROJECT_SOURCE_DIR}) > message("build with debug mode") > message(WARNING "this is warnning message") > message(FATAL_ERROR "this build has many error") # FATAL_ERROR 会导致编译失败 #### 12. 包含其它 cmake 文件 > include(./common.cmake) # 指定包含文件的全路径 > include(def) # 在搜索路径中搜索def.cmake文件 > set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake) # 设置include的搜索路径 ### 三、常见变量 > 预定义变量 > > PROJECT_SOURCE_DIR: 工程的根目录 > PROJECT_BINARY_DIR: 运行 cmake 命令的目录,通常是 ${PROJECT_SOURCE_DIR}/build > PROJECT_NAME: 返回通过 project 命令定义的项目名称 > CMAKE_CURRENT_SOURCE_DIR: 当前处理的 CMakeLists.txt 所在的路径 > CMAKE_CURRENT_BINARY_DIR: target 编译目录 > CMAKE_CURRENT_LIST_DIR: CMakeLists.txt 的完整路径 > CMAKE_CURRENT_LIST_LINE: 当前所在的行 > CMAKE_MODULE_PATH: 定义自己的 cmake 模块所在的路径,SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake),然后可以用INCLUDE命令来调用自己的模块 > EXECUTABLE_OUTPUT_PATH: 重新定义目标二进制可执行文件的存放位置 > LIBRARY_OUTPUT_PATH: 重新定义目标链接库文件的存放位置 #### 环境变量 使用环境变量 ``` $ENV{Name} ``` 写入环境变量 ``` set(ENV{Name} value) # 这里没有“$”符号 ``` > 系统信息 > CMAKE_MAJOR_VERSION: cmake 主版本号,比如 3.4.1 中的 3 > CMAKE_MINOR_VERSION: cmake 次版本号,比如 3.4.1 中的 4 > CMAKE_PATCH_VERSION: cmake 补丁等级,比如 3.4.1 中的 1 > CMAKE_SYSTEM: 系统名称,比如 Linux-2.6.22 > CMAKE_SYSTEM_NAME: 不包含版本的系统名,比如 Linux > CMAKE_SYSTEM_VERSION: 系统版本,比如 2.6.22 > CMAKE_SYSTEM_PROCESSOR: 处理器名称,比如 i686 > UNIX: 在所有的类 UNIX 平台下该值为 TRUE,包括 OS X 和 cygwin > WIN32: 在所有的 win32 平台下该值为 TRUE,包括 cygwin #### 主要开关选项 > BUILD_SHARED_LIBS: 这个开关用来控制默认的库编译方式,如果不进行设置,使用 add_library 又没有指定库类型的情况下,默认编译生成的库都是静态库。如果 set(BUILD_SHARED_LIBS ON) 后,默认生成的为动态库 > CMAKE_C_FLAGS: 设置 C 编译选项,也可以通过指令 add_definitions() 添加 > CMAKE_CXX_FLAGS: 设置 C++ 编译选项,也可以通过指令 add_definitions() 添加 ``` add_definitions(-DENABLE_DEBUG -DABC) # 参数之间用空格分隔 ``` ———————————————— 版权声明:本文为CSDN博主「淡墨映雪」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:[https://blog.csdn.net/weixin_43837968/article/details/115257575](https://blog.csdn.net/weixin_43837968/article/details/115257575)
点赞
0
收藏
1
淘帖
0
────
0
人觉得很赞
────
回复
使用道具
举报
10 回复
电梯直达
正序浏览
倒序浏览
正序浏览
沙发
WT_0213
楼主
回复
使用道具
举报
2024-1-19 11:41:41
[i=s] 本帖最后由 WT_0213 于 2024-1-19 11:48 编辑 [/i]
以上作为参考,以下为 博流提供的 [https://bl-mcu-sdk.readthedocs.io/zh-cn/latest/get_started/cmake.html](https://bl-mcu-sdk.readthedocs.io/zh-cn/latest/get_started/cmake.html) 我们SDK对应的CMake框架 # CMake 框架的使用 本节主要介绍如何使用 CMake 框架。BouffaloSDK 中为用户封装了以下函数接口,基本满足常用场景的使用。 | Function | Description | | ------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------- | | ------------------------------------------------------------------------------ | | | sdk\_generate\_library | 生成库,库名如果函数没有形参则使用当前库所在目录名 | | - | - | | sdk\_library\_add\_sources | 为库添加源文件 | | sdk\_library\_add\_sources\_ifdef | 为库添加源文件(满足 if 条件) | | sdk\_add\_include\_directories | 添加头文件路径 | | sdk\_add\_include\_directories\_ifdef | 添加头文件路径(满足 if 条件) | | sdk\_add\_compile\_definitions | 添加宏定义,不要带 -D | | sdk\_add\_compile\_definitions\_ifdef | 添加宏定义(满足 if 条件) | | sdk\_add\_compile\_options | 添加编译选项 | | sdk\_add\_compile\_options\_ifdef | 添加编译选项(满足 if 条件) | | sdk\_add\_link\_options | 添加链接选项 | | sdk\_add\_link\_options\_ifdef | 添加链接选项(满足 if 条件) | | sdk\_add\_link\_libraries | 添加静态库 | | sdk\_add\_link\_libraries\_ifdef | 添加静态库(满足 if 条件) | | sdk\_add\_subdirectory\_ifdef | 编译子目录下的 cmakelist(满足 if 条件) | | sdk\_add\_static\_library | 添加外部静态库 | | sdk\_set\_linker\_script | 设置链接脚本 | | sdk\_set\_main\_file | 设置 main 函数所在文件 | | project | 工程编译 | | target\_source(app PRIVATE xxx) | 添加源文件到 app 库中,当用户需要自己添加一些源文件又不想创建 cmakelist 单独编译成库,可以使用该项 | ## 新建工程 用户可以复制一份工程,如 helloworld,并修改 SDK\_DEMO\_PATH 变量为你使用的路径即可创建一份全新的工程 ## 为工程添加组件 如果需要编译相关组件,如 FATFS、LVGL ,需要在 proj.conf 文件中添加组件的使能,举例如下: ``` 1 set(CONFIG_FATFS 1) 2 set(CONFIG_LVGL 1) ``` ## 使能条件编译项 用户自定义的 cmake 条件编译项( **使用了 cmake 的 if 语法**)、或者使用了 sdk 带 ifdef 结尾的函数, 使能方式同上
回复
评论
使用道具
举报
板凳
lazy
回复
使用道具
举报
2024-1-19 11:48:30
学习一下
回复
评论
使用道具
举报
地板
timo
回复
使用道具
举报
2024-1-19 12:15:03
学习下,感谢分享
回复
评论
使用道具
举报
5
#
bzhou830
回复
使用道具
举报
2024-1-19 12:29:05
学习下,感谢分享
回复
评论
使用道具
举报
选择去发光,而不是被照亮
6
#
干簧管
回复
使用道具
举报
2024-1-19 14:25:40
感谢分享
回复
评论
使用道具
举报
7
#
1084504793
回复
使用道具
举报
2024-1-19 15:58:27
赞
回复
评论
使用道具
举报
8
#
noonezero
回复
使用道具
举报
2024-1-19 16:05:50
学习下
回复
评论
使用道具
举报
9
#
yuyy1989
回复
使用道具
举报
2024-1-19 19:08:15
不错,学习了
回复
评论
使用道具
举报
10
#
WT_0213
楼主
回复
使用道具
举报
2024-2-3 12:17:44
回复
评论
使用道具
举报
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
立即登录
手机登录
点评
高级模式
本版积分规则
回帖并转播
回帖后跳转到最后一页
下一页 »
1
2
/ 2 页
下一页
浏览过的版块
板子开箱专区
今日推荐
Ai-Thinker Skills 正式发布!快来试试!
九章开发板疑问
🔌手把手!1T1R 毫米波测距演示怎么跑?接入与 Python 环境配置
ONELAB开发套件常见问题Q&A:距离、角度、速度、距离门设置
【九章MCP验证板】开发环境配置教程
AI-WV02-32S 铁板烧焊接翻车
不用写代码,先跑通这两个开源例程,感受毫米波能做什么
【体验】Ai-WV02-32S 这不就跑起来了么
【问题】Ai-WV02-32S 短路
【B站/视频号直播预告】莫工带你跑通 AI→MCP 协议→硬件执行全
热帖排行
Ai-Thinker Skills 正式发布!快来试试!
九章开发板疑问
🔌手把手!1T1R 毫米波测距演示怎么跑?接入与 Python 环境配置
ONELAB开发套件常见问题Q&A:距离、角度、速度、距离门设置
【九章MCP验证板】开发环境配置教程
TB-04模块 从机收不到主机信息
AI-WV02-32S 铁板烧焊接翻车
<Ai-WB2-12F>这个模组请教个问题-FTP下载
统计信息
会员数: 31170 个
话题数: 42256 篇
首页
分类
我的