CMake命令

2023-11-18

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配置
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CMake命令 的相关文章

  • Android中如何通过ViewModel类在Activity和Fragment之间共享数据?

    我想知道是否可以传递一个在 Activity 类中声明的字符串数据 并将该字符串数据传递给 ViewModel 类 然后将数据传递给 Fragment 类 视图模型类 class TimeTableViewModel extends Vie
  • android ndk 多点触控?

    我正在编写一个仅使用本机代码的应用程序 那么ndk中是否可以获取多点触控事件呢 我感觉我已经搜索了整个网络 但什么也没找到 有谁知道如何做到这一点 是的 您可以检查名为native activity查看如何获取输入事件 寻找engine h
  • Auto-value-gson出现接口错误,注册一个InstanceCreator?

    我有一个如下所示的接口类 public interface Species String name And a Human实现的类 AutoValue使用类型适配器 AutoValue public abstract class Human
  • 多种语言的多种字体

    我最近在开发应用程序时遇到了一种情况 我必须在文本视图中显示不同的语言 目前我正在展示一些使用字体 字体像这样 Typeface tf Typeface createFromAsset this getAssets DroidHindi t
  • 如何调试“com.android.okhttp”

    在android kitkat中 URLConnection的实现已经被OkHttp取代 如何调试呢 OkHttp 位于此目录中 external okhttp android main java com squareup okhttp 当
  • Android中如何使用JNI获取设备ID?

    我想从 c 获取 IMEIJNI 我使用下面的代码 但是遇到了未能获取的错误cls 它总是返回NULL 我检查了环境和上下文 它们都没有问题 为什么我不能得到Context班级 我在网上搜索了一下 有人说我们应该使用java lang Ob
  • Android studio - 如何保存先前活动中选择的数据

    这是我的代码片段 这Textview充当按钮并具有Onclicklistner在他们 当cpu1000时Textview单击它会导致cpu g1000其代码如下所示的类 public class Game 1000 extends AppC
  • Android 辅助功能服务检测通知

    我试图让我的应用程序在显示通知时进行检测 我已在设置应用程序中启用它并且onServiceConnected确实接到电话 但是当我创建通知或通过 gmail 应用程序接收电子邮件时 什么也没有发生 onAccessibilityEvent没
  • 警报对话框中的 Webview 不显示内容

    我正在开发一个 Android 应用程序 我需要在网络视图和警报对话框上显示一个网站 该站点显示在网络视图中 但不显示在警报对话框中 到目前为止 这是我的代码 WebView WebView myWebView WebView v find
  • 将非 Android 项目添加到 Android 项目

    我在 Eclipse 中有三个项目 Base Server 和 AndroidClient Base和Server是Java 1 7项目 而AndroidClient显然是一个android项目 基础项目具有在服务器和 Android 客户
  • 如何使用 Retrofit 解析嵌套 json....?

    我不知道该怎么办使用 Retrofit 解析 json 熟悉使用 Retrofit 解析简单的 json 但不熟悉解析嵌套Json using Retrofit 这是我的 Json 数据 current observation image
  • 如何仅从 Firestore 获取最新更新的数据?

    在 Firestore 上发现任何更改时始终获取整个文档 如何只获取最近更新的数据 这是我的数据 我需要在第一次加载时在聊天中按对象顺序 例如 2018 09 17 30 40 msg和sendby 并且如果数据更新则仅获取新的msg和se
  • Android应用主题更换流畅

    我正在开发一个提供白天和夜间主题的项目 我正在更改主题 夜间主题 AppCompatDelegate setDefaultNightMode AppCompatDelegate MODE NIGHT YES 日主题 AppCompatDel
  • Android 为什么这不会抛出错误的线程异常?

    我的印象是视图只能从主线程操作 但是 为什么这不会崩溃 public class MainActivity extends Activity TextView tv Override protected void onCreate Bund
  • 为什么 Google 建议将库复制到您的树中?

    谷歌的Play 服务 API 的使用说明 http developer android com google play services setup html 例如 说 将 extras google google play service
  • Android Studio代理设置构建错误

    每当我尝试在 Android Studio 中构建应用程序时 都会收到以下错误 Error 169 254 16 169 254 16 Will ignore proxy settings for these hosts 我收到错误 5 次
  • Android:分配内存失败

    我正在尝试创建一个具有 2047 mb 内存的模拟器 当我运行它时 我收到此错误 2011 02 22 14 24 14 Emulator 2011 02 22 14 24 14 Emulator This application has
  • Android S8+ 警告消息“不支持当前的显示尺寸设置,可能会出现意外行为”

    我在 Samsung S8 Android 7 中收到此警告消息 APP NAME 不支持当前的显示尺寸设置 可能会 行为出乎意料 它意味着什么以及如何删除它 谢谢 通过添加解决supports screens 机器人 xlargeScre
  • JetPack Compose - 卡中行中的weight() 不起作用

    创建 Android 应用程序时 我将一些可组合项放在卡片的一行中 如下所示 但它没有按我的预期工作 我添加 weight 1f 的可组合项不再显示 data class Test val title String val text Str
  • 在线性布局内的 ScrollView 内并排对齐 TextView

    我有一个带有滚动视图的线性布局 我想保留它的当前格式 但只需将 textView2a 和 textView3a 并排放置 而不会破坏我当前的布局格式 我已经包含了我最近的尝试 但它们似乎不正确 提前致谢 Java菜鸟 当前有效的 XML

随机推荐

  • SRS文档

    主要负责人 王希敏201303014099 http www cnblogs com wangximin 日历记事本的用例建模 一 以现实世界中日历中的便签 或记事本等为原型 我们平常所使用的日历 每页都会留有一些空白的部分 用来记录当日
  • 电脑一开机,内存爆满90%以上

    我的是联想电脑 电脑一开机 内存爆满 然后打开任务管理器 并没有显示任何的应用程序所占内存较大 我然后又去打开杀毒软件 关闭电脑自动更新 都没有效果 最后 解决的办法是运行window 内存诊断 最后100 之后重启成功
  • 历次改革学习-20220816

    通过分税制改革 中央政府实现了政治上和经济上的集权 必须指出的是 土地和房地产问题后来发展到如此严峻的程度 也是1994年分税制的结果 因为分税制事实上把土地支配权给了地方政府 地方政府也各显神通 发展出包括地方融资平台在内的各种推动地方发
  • Java代码质量评估工具

    概述 Java代码的质量评估主要包括代码的可维护性 健壮性 以及在运行时能达到既定的性能目标 可维护性主要包括代码的可读性 在关键的代码上提供详细注释 在设计类或方法以及代码逻辑时符合设定的编码规范 健壮性主要包括编写代码时应使用常用的设计
  • Spring系列之@Aspect中5中通知详解

    Aspect中有5种通知 Before 前置通知 在方法执行之前执行 Aroud 环绕通知 围绕着方法执行 After 后置通知 在方法执行之后执行 AfterReturning 返回通知 在方法返回结果之后执行 AfterThrowing
  • Java EE企业级-第1章 Spring的基本应用

    第1章 Spring的基本应用 重点 ApplicationContext容器使用 属性setter方法注入的实现 Spring中的IoC和DI Spring Spring是分层的JavaSE EE full stack 轻量级框架 以Io
  • Mockito 如何 mock 静态方法

    在实际工作当中 我们经常会遇到需要对静态方法进行 mock 的情况 在 mockito 2 x 的时代 我们需要借助 powmock 才能实现 当 mockito 进化到了 3 4 0 版本以后 也开始对静态方法 mock 进行了支持 主要
  • 组装台式计算机需要哪些配件,组装一台电脑需要哪些配件【详细列举】

    电脑是我们生活中常见的电子产品 尤其是台式机是我们大家常用的工具 而对于电脑而言大部分朋友都是不陌生的 因为电脑在我们平时生活中是经常使用的 但是对于购买电脑的时候 很多朋友都会觉得商场的电脑总是不符合我们心意 这个时候组装电脑就是非常有需
  • 你真的把数据库事务搞懂了吗,有图有真相,图文并茂!

    数据库事务 数据库事务 jdbc事务 事务的ACID 数据库的并发 数据库的四种隔离级别 数据库事务 数据库事务 transaction 是访问 并可能操作各种数据项的 一个数据库操作序列 这些操作要么 全部执行 要么 全部不执行 是一个不
  • 利用 DNSLog无回显注入

    DNSLog概念 DNSLog 域名系统日志 是一种特殊的技术和服务 用于捕获和记录通过域名系统 DNS 协议进行的请求和响应 它的目的是帮助用户跟踪 分析和管理DNS流量 并收集与域名相关的信息 基本上 DNSLog服务提供了一个自定义的
  • Archlinux 折腾记录~

    新建虚拟机 值得注意 典型配置 直接选择镜像文件 官网下载 版本选择 其他Linux N x 或更高版本内核64位 开机前 虚拟机设置 gt 选项 gt 高级 gt 选择UEFI 必须 配置 1 确保网络畅通 ping www baidu
  • 直播APP源码开发,直播APP源码搭建,如何优化程序?

    直播APP源码由最初的传统秀场类直播 再到现在各种细分垂直分类的游戏和电商等类别 随着技术和时代的不断发展和更新迭代 出现了一种名为SDK的东西 成为了开发直播app源码时必需的好帮手 1 节约成本 开发软件的过程中 如果是一点点地敲代码完
  • 解决python在windows上运行弹出cmd窗口(dos窗口)

    运行python程序的时候会在背景显示一个cmd 要想不显示其实很简单 虽然是我找了1个小时 才了解的基本知识 方法1 pythonw xxx py 方法2 将 py改成 pyw 这个其实就是使用脚本解析程序pythonw exe 原文 1
  • Ubuntu安装ROS

    原文链接 https blog csdn net qq 44830040 article details 106049992 这也是我在ubuntu里面安装ROS的第N次 以前每次安装过程都忘记总结了 导致每次安装ROS都浪费了很多的时间用
  • Mysql 安装

    Mysql 安装 环境 windwos 10 1511 64bit mysql 5 7 14 一 下载mysql 1 在浏览器里打开mysql的官网http www mysql com 2 进入页面顶部的 Downloads 安卓培训 IT
  • Vite3 + Svelte3使用@import导入scss样式

    近年来 前端技术日新月异 Vite Vue3 Svelte SolidJS 等框架工具大放异彩 身为一个前端开发 总感觉一刻不学习就要out了 最近使用 Vite3 Svelte3 来构建封装自定义的 Web Components 开始了艰
  • 开发板配置NFS服务

    文章目录 NFS介绍 NFS版本 NFS服务器和客户端 安装NFS 配置NFS服务器 启动NFS服务 挂载NFS共享 NFS安全性 NFS日志 开发板配置NFS环境 环境 操作前先关闭防火墙 配置过程 server端的配置 开发板的操作 常
  • 华为OD机试真题 Java 实现【拔河比赛】【2023 B卷 100分】,附详细解题思路

    目录 专栏导读 一 题目描述 二 输入描述 三 输出描述 四 解题思路 五 Java算法源码 六 效果展示 1 输入 2 输出 3 说明 华为OD机试 2023B卷题库疯狂收录中 刷题点这里 专栏导读 本专栏收录于 华为OD机试 JAVA
  • JAVA--windows和linux下执行.class

    windows和linux下执行 class windows下执行 class linux下执行 class windows下执行 class title testJOb java cp jar com yang jobTest start
  • CMake命令

    1 aux source directory 查找当前目录所有源文件 并将源文件名称列表保存到DIR SRCS变量 不能查找子目录 aux source directory DIR SRCS 2 添加一个库或预编译库 添加一个库 名为