Android.mk 和 CMakeLists.txt 的转换规则

2023-05-16

Android.mk 和 CMakeLists.txt 都是用来构建 Android 应用程序或库的工具。但是它们有不同的语法和规则,所以将一个 Android.mk 文件转换成一个 CMakeLists.txt 文件需要一些注意事项。

下面是一些 Android.mk 转换到 CMakeLists.txt 的规则:

  1. 声明要使用的语言和最低版本

在 CMakeLists.txt 中,你需要在文件的开头声明你要使用的编程语言和最低版本,例如:

cmake_minimum_required(VERSION 3.10)
project(myapp CXX)

这个示例声明了 C++ 语言,并且要求 CMake 的最低版本为 3.10。

  1. 声明要编译的源代码

在 Android.mk 中,你可以使用 LOCAL_SRC_FILES 指令来声明要编译的源代码文件。在 CMakeLists.txt 中,你可以使用 add_executable 或 add_library 函数来声明要编译的源代码文件。例如:

add_executable(myapp
    src/main.cpp
    src/utils.cpp
)

这个示例声明了一个名为 myapp 的可执行文件,它将编译 src/main.cpp 和 src/utils.cpp 两个源代码文件。

  1. 声明依赖库

在 Android.mk 中,你可以使用 LOCAL_LDLIBS 指令来声明依赖库。在 CMakeLists.txt 中,你可以使用 target_link_libraries 函数来声明依赖库。例如:

target_link_libraries(myapp
    log
    android
)

这个示例声明了一个名为 myapp 的可执行文件,它依赖于 log 和 android 两个库。

  1. 声明编译选项
    在 Android.mk 中,你可以使用 LOCAL_CFLAGS 和 LOCAL_CPPFLAGS 指令来声明编译选项。在 CMakeLists.txt 中,你可以使用 target_compile_options 函数来声明编译选项。例如:
target_compile_options(myapp PRIVATE
    -Wall
    -Wextra
    -Werror
)

这个示例声明了一个名为 myapp 的可执行文件,它将使用 -Wall、-Wextra 和 -Werror 三个编译选项。

  1. 其他规则

除了上述规则外,还有一些其他的规则需要注意。例如,Android.mk 中的 LOCAL_MODULE 指令通常会被转换成 CMakeLists.txt 中的项目名称。此外,CMakeLists.txt 中还有很多其他的指令和函数可以用来声明项目的配置和构建选项。因此,将 Android.mk 转换成 CMakeLists.txt 还需要根据具体情况进行调整和修改。

  1. 处理头文件

在 Android.mk 中,你可以使用 LOCAL_C_INCLUDES 和 LOCAL_CPP_INCLUDES 指令来声明头文件的路径。在 CMakeLists.txt 中,你可以使用 target_include_directories 函数来声明头文件的路径。例如:

target_include_directories(myapp PRIVATE
    include
)

这个示例声明了一个名为 myapp 的可执行文件,它将使用 include 目录下的头文件。

  1. 处理编译器和链接器选项

在 Android.mk 中,你可以使用 LOCAL_CFLAGS 和 LOCAL_CPPFLAGS 指令来声明编译器选项。在 CMakeLists.txt 中,你可以使用 target_compile_options 函数来声明编译器选项。例如:

target_compile_options(myapp PRIVATE
    -std=c++11
    -fexceptions
    -Wall
    -Werror
)

这个示例声明了一个名为 myapp 的可执行文件,它将使用 -std=c++11、-fexceptions、-Wall 和 -Werror 四个编译器选项。

在 Android.mk 中,你可以使用 LOCAL_LDFLAGS 指令来声明链接器选项。在 CMakeLists.txt 中,你可以使用 target_link_options 函数来声明链接器选项。例如:

target_link_options(myapp PRIVATE
    -Wl,--no-undefined
    -Wl,-z,relro,-z,now
)

这个示例声明了一个名为 myapp 的可执行文件,它将使用 -Wl,–no-undefined、-Wl,-z,relro,-z,now 两个链接器选项。

  1. 处理源文件

在 Android.mk 中,你可以使用 LOCAL_SRC_FILES 指令来声明源文件。在 CMakeLists.txt 中,你可以使用 add_executable 或 add_library 函数来声明源文件。例如:

add_executable(myapp
    src/main.cpp
    src/utils.cpp
)

这个示例声明了一个名为 myapp 的可执行文件,它将编译 src/main.cpp 和 src/utils.cpp 两个源文件。

  1. 处理库文件

在 Android.mk 中,你可以使用 LOCAL_LDLIBS 指令来声明库文件。在 CMakeLists.txt 中,你可以使用 target_link_libraries 函数来声明库文件。例如:

target_link_libraries(myapp
    log
    android
)

这个示例声明了一个名为 myapp 的可执行文件,它将使用 log 和 android 两个库文件。

总的来说,将 Android.mk 转换成 CMakeLists.txt 需要注意语法和规则的转换,也需要考虑具体的项目需求。因此,你需要根据自己的项目情况进行调整和修改。



LOCAL_SHARED_LIBRARIES

LOCAL_SHARED_LIBRARIES 是 Android NDK 中 Android.mk 文件中的一种变量,它用于指定当前模块依赖的共享库。在 CMake 中,可以使用 find_package() 或 find_library() 命令来查找和链接共享库。

以下是将 Android.mk 文件中的 LOCAL_SHARED_LIBRARIES 转换为 CMake 的示例:

假设 Android.mk 中有以下内容:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := my_module
LOCAL_SRC_FILES := my_module.cpp
LOCAL_SHARED_LIBRARIES := libfoo libbar
include $(BUILD_SHARED_LIBRARY)

这个模块依赖于 libfoo 和 libbar 两个共享库。

在 CMake 中,可以使用以下命令来链接这些库:

# 查找 libfoo 库
find_library(foo_lib foo)
# 查找 libbar 库
find_library(bar_lib bar)
# 创建 my_module 目标,并链接 libfoo 和 libbar
add_library(my_module SHARED my_module.cpp)
target_link_libraries(my_module ${foo_lib} ${bar_lib})

这里使用了 find_library() 命令来查找库,它会在系统库路径中查找库文件,并返回库的完整路径。然后使用 add_library() 命令创建目标,并使用 target_link_libraries() 命令将库链接到目标中。

需要注意的是,在 CMake 中,库的名称通常是去掉前缀和后缀的纯库名,例如 libfoo.so 库在 CMake 中的名称为 foo。如果库名不规范,可以使用 find_library() 命令的第一个参数指定库的完整名称。

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

Android.mk 和 CMakeLists.txt 的转换规则 的相关文章

  • 如何在android中实现触摸平滑图像橡皮擦?

    我已经从 API 演示中看到了finturePaint java 我想实现触摸平滑橡皮擦 通过在android中触摸移动来擦除部分图像 FingerPaint 告诉我要实现这个 mPaint setXfermode new PorterDu
  • 检查 WebView 元素时的 UiAutomator 错误

    I have recently started automation testing in android and was using UiAutomator tool for inspecting UI elements Surprisi
  • 我在布局上看不到任何 FirebaseRecyclerAdapter 项目

    我试图将数据从 Firebase 数据库检索到我的布局 但我看不到任何项目FirebaseRecyclerAdapter在布局中 请帮忙 我按照一个教程展示了如何做到这一点 当我运行应用程序时 我没有看到任何项目 但我可以滚动 public
  • Android短音的正确播放方法?

    我正在创建一个应用程序 屏幕上将有多个图像 这些图像将是按钮 点击时会播放短促的声音 我对此进行了研究 只能找到我当前用来播放声音的方法 这似乎根本没有响应 我希望声音能够快速播放并且能够响应多次快速点击 我不确定这在 Android 中是
  • 如何在android中显示保存在sdcard文件夹中的图像[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 当我正在显
  • 如何在 Linux 内核中定义并触发我自己的新软中断?

    我想在 Linux 内核中创建自己的软中断 这是正确的方法吗 In the init我想触发该模块的softirq我将添加一个调用 394 void open softirq int nr void action struct softir
  • Android 初学者:Android gridview 中的触摸事件

    我正在使用以下代码来使用 gridview 执行操作 稍作修改http developer android com resources tutorials views hello gridview html http developer a
  • 通过 WhatsApp 发送消息

    由于我发现了一些较旧的帖子 表明 Whatsapp 不支持此功能 我想知道是否发生了变化 以及是否有办法打开与我通过意图发送的号码进行 Whatsapp 聊天 UPDATE请参阅https faq whatsapp com en andro
  • Bitmap.getPixels() 中的 IllegalArgumentException

    我想将数据从位图复制到int using getPixels 这是我当前的代码 int pixels new int myBitmap getHeight myBitmap getWidth myBitmap getPixels pixel
  • 在 android 中建立与 MySQL 的池连接

    我需要从我的 Android 应用程序访问 MySQL 数据库 现在所有的工作都通过 DriverManager getConnection url 等等 但我必须从多个线程访问数据库 所以我必须使用连接池 问题1 是 com mysql
  • Android Studio 与本地网络共享上的项目文件

    这是我的设置 Android Studio 项目文件位于 Ubuntu 14 10 盒子上的共享文件夹中 尝试在 Windows 8 机器上运行 Android Studio 1 0 2 并将 U 驱动器映射到包含项目文件的 Ubuntu
  • 图像作为电子邮件附件

    我想构建一个应用程序 我可以在电子邮件中附加图像 打开图像并将其设置为我的壁纸 我想让它跨平台 所以你能告诉我是否可以使用phonegap 或者我是否必须为iphone和android构建一个本机应用程序 您好 如果您只想通过电子邮件附加图
  • Android 中如何通过彩信发送图片?

    我正在开发多媒体应用程序 我正在通过相机捕获一张图像 并希望将该图像和文本发送到其他号码 但我不知道如何通过彩信发送图像 MMS 只是一个 http post 请求 您应该使用执行请求额外的网络功能 final ConnectivityMa
  • 使用 AsyncTask 传递值

    我一直在努力解决这个问题 但我已经到了不知道该怎么办的地步 我想做的是使用一个类下载文件并将其解析为字符串 然后将该字符串发送到另一个类来解析 JSON 内容 所有部件都可以单独工作 并且我已经单独测试了所有部件 我只是不知道如何将值发送到
  • 我应该释放或重置 MediaPlayer 吗?

    我有自己的自定义适配器类 称为 WordAdapter 并且我正在使用媒体播放器 名为pronounce WordAdapter 类中的全局变量 我有不同的活动 其中每个列表项都有线性布局 名为linearLayout 我正在设置onCli
  • Dagger 2 没有生成我的组件类

    我正在使用 Dagger 2 创建我的依赖注入 几个小时前它还在工作 但现在不再生成组件 这是我创建组件的地方 public class App extends Application CacheComponent mCacheCompon
  • Android 中的处理程序与异步调用

    目前我正在使用处理程序来调用 Web 服务方法以使其在后台运行 问题是它需要更多的时间来给出响应 在性能方面似乎更昂贵 现在我计划使用异步调用 哪一个是最好的 Android 中的处理程序和异步调用有什么区别 请帮我想出一个最好的解决方案
  • 没有支持 FEATURE_CAMERA_EXTERNAL 的 Android 设备

    根据this doc https source android com devices camera external usb cameras一些 Android 设备允许使用 Camera2 API 访问外部 USB 摄像头 我检查了大约
  • Android:如何从网络异步获取搜索建议?

    我创建了一个可搜索的活动 现在 我想添加从网络服务获取的搜索建议 我想异步获取这些建议 根据添加自定义建议 http developer android com guide topics search adding custom sugge
  • 如何使用 AccessibilityService 在 Android 中模拟按键

    我正在编写一个辅助服务 我一直在尝试在应用程序上进行一些自动搜索 我使用accessibilityservice action paste来填充EditText 然后我需要模拟软键盘上的按键 但我不知道如何做 你们能帮我一下吗 你可以尝试A

随机推荐

  • ubuntu16.04桌面版开机进入命令行模式

    我们大部分个人的linux系统计算机都是使用图形界面模式的操作 xff0c 有些时候我们也可以在纯命令行模式下进行操作 xff0c 这里给大家介绍一个在开机启动的时候进入命令行的两种方法 ubuntu 16 04LTS系统 方法 步骤 系统
  • 8本推荐游戏开发书籍

    很多刚刚接触游戏开发的朋友经常问我 xff1a 如何开始学习游戏开发 xff1f 我从事游戏开发行业很多年了 xff0c 坦率地讲 xff0c 开发游戏充满挑战性 xff0c 需要开发人员具备大量的技能与积极的创新精神 希望这篇小文能帮助朋
  • GNOMe面板丢失问题解决

    今天用安装虚拟机时屏幕太小 xff0c 安装框又不能向上拉 xff0c 导致我看不到下一步图标 xff0c 一怒之下 xff0c 把底面板给删了 xff0c 从此走上了麻烦之路 xff01 没有底面版 xff0c 很多最小化的图标都找不到
  • Ubuntu操作系统综合贴

    本文转载自卡饭论坛http bbs kafan cn thread 1551594 1 1 html xff0c 作者 xff1a ubuntu2011 Linux简介及安装 Linux是什么 xff1f Linux是一种自由和开放源代码的
  • Spring4+Hibernate4+SpringMVC整合配置

    这里是Spring4 3 9 43 Hibernate4 0 2的整合配置 配置web xml span class hljs pi lt xml version 61 34 1 0 34 encoding 61 34 UTF 8 34 g
  • Android Keystore System介绍

    翻译 sdk docs training articles keystore html q 61 keystore q 61 keystore KeyStore KeyStore负责维护加密密钥及其所有者 可以通过修改JAVA HOME l
  • html5之div居中

    效果如图 xff1a 代码如下 xff1a navright display inline block vertical align middle width 100 height 100 min height 400px border 1
  • 服务器后台自动运行程序和停止

    后台运行命令 如何后台运行python程序 关键的命令 xff1a nohup 只需要输入下面的命令就可以在后台一直执行python程序啦 nohup python u test py gt test log 2 gt amp 1 amp
  • 谷歌浏览器(Chrome)插件安装失败的解决办法

    最新的谷歌浏览器下载完成以后进行安装插件时 xff0c 可能会提示 无法从该网站添加应用 扩展程序和用户脚本 的提示 这是因为谷歌比较重视用户信息安全性的 xff0c 所以不希望用户随便安装一些除官方商店之外的东西 xff0c 以免造成用户
  • Docker-CentOS开启防火墙firewalled映射Docker端口

    开启docker的Tomcat容器后 xff0c 启动 docker run d p 8080 8080 tomcat 访问不了Tomcat 查看防火墙所有开放的端口 firewall cmd zone 61 public list por
  • mysql 5.6 utf-8 编码设置

    mysql 5 5 utf 8编码 正确设置的方法 xff1a 在 etc my cnf mysqld utf 8 设置 character set server 61 utf8 collation server 61 utf8 gener
  • 文件内容查找方式

    第一种 xff0c 使用windows自带的查找工具 搜索工具里面有 高级选项 xff0c 选择 文件内容 然后进行搜索即可 第二种 xff0c 使用命令行 在需要进行搜索的文件夹下使用命令行 xff1a Get span class to
  • Image打包流程-Android10.0编译系统(四)

    摘要 xff1a 本节主要来进行Android10 0 Image打包流程 xff0c 理解system img是如何打包的 1 概述 前面我们讲完了Android10 0 编译的初始化和make的完整流程 xff0c 从make中我们看到
  • Ubuntu18.04安装踩坑与排错记录

    很早以前就想装Ubuntu玩玩了 xff0c 今天终于动手实现了这个想法 但过程并不顺利 xff0c 所以记录一下 对他人可能借鉴意义不大 xff0c 但对自己来说还是有记录价值的 机子是之前淘汰掉的华硕笔记本 xff08 14年买的 xf
  • Jupyter Notebook FileNotFoundError: [WinError 2] 系统找不到指定的文件

    问题描述 xff1a 通过Anaconda新创建环境 tfenv python 61 3 5 5 并依次安装tensorflow ipython xff0c jupyter xff0c matplotlib这三个包及其依赖包 然后在该环境下
  • 命令提示符(cmd)的一些简单用法

    命令提示符 xff08 cmd xff09 快捷键 xff1a win 43 r 切换位置 xff1a 盘名 xff1a 进入目录 xff1a cd 43 文件夹名 xff08 tab可以切换文件夹 xff09 只要路径写对cd可以访问多级
  • Java中,&&与&,||与|的区别

    1 1 逻辑运算符 amp amp xff08 短路与 xff09 xff0c amp 用法 xff1a amp amp 和 amp 都是表示与区别是 xff1a amp amp 若第一个条件不满足 xff0c 后面条件就不再判断 而 am
  • Java基础类(六):Collections工具类

    目录 1 Collections 1 1 排序操作 xff1a xff08 均为static方法 xff09 1 2 查找 替换 1 3 同步控制 1 4 返回不可变集合 1 Collections Collections 是一个操作 Se
  • Bash脚本:采用for循环重复执行某条指令100次

    1 新建一个脚本文件 直接vim for sh就可以 2 编辑脚本文件 bin bash for i 61 1 i lt 61 100 i 43 43 do test 想要重复执行的命令 xff09 done 3 将脚本文件变为可执行文件
  • Android.mk 和 CMakeLists.txt 的转换规则

    Android mk 和 CMakeLists txt 都是用来构建 Android 应用程序或库的工具 但是它们有不同的语法和规则 xff0c 所以将一个 Android mk 文件转换成一个 CMakeLists txt 文件需要一些注