CMake命令

1.aux_source_directory

#查找当前目录所有源文件,并将源文件名称列表保存到DIR_SRCS变量 (不能查找子目录)
aux_source_directory(. DIR_SRCS)

2.添加一个库或预编译库

#添加一个库,名为<name>。指定STATIC,SHARED,MODULE参数来指定库的类型。STATIC:静态库;SHARED:动态库,
#MODULE:在使用dyld的系统有效,若不支持dyld,等同于SHARED。EXCLUDE_FROM_ALL:表示该库不会被默认构建。
#source1 source2 ... srouceN:用来指定库的源文件
add_library(<name> [STATIC|SHARED|MODULE] [EXCLUDE_FROM_ALL] source1 source2 ... sourceN)

#添加一个已存在的预编译库,名为<name>。一般配合set_target_properties使用
add_library(<name> <SHARED|STATIC|MODULE|UNKNOW> IMPORTED)
例子:
add_library(test SHARED IMPORTED)
set_target_properties(
	test #指明目标库名
	PROPERTIES IMPROTED_LICATION #指明要设置的参数
	库路径/${ANDROID_ABI}/libtest.so # 导入库的路径
)

3.set命令

#设置可执行文件的输出路径(EXCUTABLE_OUTPUT_PATH是全局变量)
set(EXECUTABLE_OUTPUT_PATH [output_path])

#设置库文件的输出路径(LIBRARY_OUTPUT_PATH是全局变量)
set(LIBRARY_OUTPUT_PATH [output_path])

#设置C++编译参数(CMAKE_CXX_FLAGS是全局变量)  相当于设置环境变量
set(CMAKE_CXX_FLAGS "-Wall std=c++11")

#设置源文件集合(SOURCE_FILES是本地变量即自定义变量)
set(SOURCE_FILES main.cpp test.cpp ...)

4.设置头文件目录

#可以用相对路径或绝对路径 也可以用自定义的变量值
include_directories(./include ${MY_INDLUDE})
相当于g++选项中的-I参数

5.添加可执行文件

add_executable(<name> ${SRC_LIST})
name是文件名  SRC_LIST 文件列表

6.将若干库链接到目标库文件

target_link_libraries(<name> lib1 lib2 lib3)
name为目标库的名字

#如果出现互相依赖的静态库,CMake会允许依赖图中包含循环依赖 如:
add_library(A STATIC a.c)
add_library(B STATIC b.c)
target_link_libraries(A B)
target_link_libraries(B A)
add_executable(main main.c)
target_link_libraries(main A)

#链接的顺序应当符合gcc链接顺序规则,被链接的库放在依赖它的库后面,即如果上面的命令中,lib1依赖于lib2,
lib2又依赖于lib3,则在上面命令中必须严格按照lib1lib2lib3的顺序排列,否则会报错

7.添加编译参数 add_definitions

#为当前路径以及子目录的源文件加入-D引入的define flag
add_definitions(-DF00 -DDEBUG ...)

8.指定子目录的CMake源文件

#sub_dir指定包含CMakelists.txt和源文件的子目录位置
#binary_dir是输出路径,一般可以不指定
add_subdirectory(sub_dir [binary_dir])

如果当前目录下还有子目录时可以使用add_subdirectory,子目录中也需要包含有CMakelists.txt

9.file命令
在这里插入图片描述
10.设置某个路径的一种属性

set_directory_properties(PROPERTIES prop1 value1 prop2 value2)
#设置某个路径的一种属性
#prop1, prop2代表属性,取值为:INCLUDE_DIRECTORIES LINK_DIRECTORIES INCLUDE_REGULAR_EXPRESSION ADDITIONAL_MAKE_CLEAN_FILES

11.在给定的作用域内设置一个命名的属性

set_property(<GLOBAL | DIRECTORY [dir] | TARGET [target ...] | SOURCE [src1 ... ] | TEST [test1 ... ] | 
	CACHE [entry1 ...]> [APPEND] PROPERTY <name> [value ..])
#PROPERTY参数是必须的
#第一个参数决定了属性可以影响的作用域:
	GLOBAL:全局作用域
	DIRECTORY:默认当前路径,也可以用[dir]指定路径
	TARGET:目标作用域,可以是0个或多个已有目标
	SOURCE:源文件作用域,可以是0个或多个源文件
	TEST: 测试作用域,可以是0个或多个已有的测试
	CACHE:必须指定0个或多个cache中已有的条目

案例1:多个源文件处理

如果源文件很多,把所有文件一个个加入很麻烦,可以使用aux_source_directory命令或者file命令,会查找指定目录
下的所有源文件,然后将结果存进指定变变量名

#查找当前目录所有源文件,并将名称保存到DIR_SRCS变量 不能查找子目录
aux_source_directory(. DIR_SRCS)
#也可以使用
file(GLOB DIR_SRCS *.c *.cpp)

add_library(native-lib SHARED ${DIR_SRCS})

案例2:多目录多源文件处理

主目录中的CMakelists.txt中添加add_subdirectory(child)命令,指明本项目包含一个子项目child。并在
target_link_libraries指明本项目需要链接一个名为child的库
子目录child中创建CMakelists.txt,这里child编译为共享库
aux_source_directory(. DIR_SRCS)
add_subdirectory(child)
add_library(native-lib SHARED ${DIR_SRCS})
target_link_libraries(native-lib child)

#child目录下的CMakeLists.txt
aux_source_directory(. DIR_LIB_SRCS)
add_library(child SHARED ${DIR_LIB_SRCS})

案例3:添加预编译库
Android6.0之前

假设本地项目引入了libimported-lib.so
# 使用IMPROTED标志告知CMake只希望将库导入到项目中,如果是静态库则将SHARED改为STATIC
add_library(imported-lib SHARED IMPROTED)
set_target_properties(improted-lib PROPERTIES IMPORTED_LOCATION <路径>/libimported-lib.so)
aux_source_directory(. DIR_SRCS)
add_library(native-lib SHARED ${DIR_SRCS})
target_link_libraries(native-lib imported-lib)

Android6.0 之后

# set命令定义一个变量
# CMAKE_C_FLAGS:c的参数,会传递给编译器
# 如果是c++文件,需要用CMAKE_CXX_FLAGS
# -L 库的查找路径
相当于设置环境变量
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -L[SO所在目录]")

案例4:添加头文件目录

为了确保CMake可以在编译时定位头文件,使用include_directories,相当于g++选项中的-I参数。
这样就可以使用#include<xx.h>,否则需要使用#include “path/xx.h”

案例5:build.gradle配置
在这里插入图片描述

### CMake 命令基本用法 CMake 是一种跨平台构建工具,用于管理软件项目的构建过程。以下是关于 `cmake` 的一些常见命令及其用途: #### 构建项目的基础流程 在指定的源码目录下运行以下命令可以初始化并配置构建环境: ```bash cmake .. ``` 此命令会在当前工作目录下的父级目录寻找 `CMakeLists.txt` 文件,并基于该文件生成相应的构建系统文件[^1]。 #### 查看已安装的 CMake 版本 为了确认系统的 CMake 安装状态以及其版本号,可使用如下命令: ```bash cmake --version ``` 这会返回类似于 `cmake version 3.22.1` 这样的输出结果[^2]。 #### 自定义模块路径设置 如果需要引入自定义模块,则可以在 `CMakeLists.txt` 中通过修改变量来扩展默认查找范围。具体操作方法为向列表追加新的搜索位置: ```cmake list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake/Modules/) ``` 这里假设用户的模块存储于 `${PROJECT_SOURCE_DIR}/cmake/Modules/` 路径之下[^3]。 #### 配置特定选项参数化脚本调用实例 对于某些复杂场景可能涉及多目标交叉编译等情况时,可以通过传递额外标志完成定制化的处理逻辑实现灵活控制行为模式比如下面这个例子展示了如何针对不同硬件架构启用 GPU 加速支持同时调整优化级别至调试模式: ```bash ./buildnativeoperations.sh blas -c cuda -cc YOUR_DEVICE_ARCH -b debug ``` 其中 `-c cuda` 表明采用 CUDA 技术栈作为计算后端;而 `-cc YOUR_DEVICE_ARCH` 则指定了适配的目标设备微体系结构代号[-4]。 --- ### 解决问题指南 当遇到错误提示或者功能异常的时候可以从以下几个方面入手排查原因分析解决办法: 1. **验证输入参数合法性**: 确认所提供的各项开关名称拼写无误且符合官方文档规定. 2. **检查依赖关系满足度**: 对应组件是否存在缺失现象, 是否已经正确加载相应库文件. 3. **审查日志记录详尽程度**: 提高消息等级以便获取更多上下文线索辅助定位根源所在. 最后提醒开发者务必保持最新稳定发行版同步更新频率从而享受持续改进带来的便利体验.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值