CMake依赖第三方so库
本文以在Android App工程中依赖xhook为例,记录如何在CMakeLists.txt中依赖外部第三方so库。
编译xhook
1 下载xhook源码
git clone https://github.com/iqiyi/xHook.git
2 修改支持的abi
cd xHook
xHook 支持armeabi, 需要使用android-ndk 16, 因为android-ndk 17以上已经不支持armeabi了。如果不需要armeabi,并且使用高版本的android-ndk,可以去掉xHook对armeabi的支持。
打开 ./libxhook/jni/Application.mk
删除armeabi:
3 编译xhook
执行以下命令,编译xHook:
./build_libs.sh
该脚本会调用ndk-build命令,需要先将ndk的目录配置在~/.bashrc中:
export PATH=/home/zhangjg/tools/android-ndk-r21:$PATH
./build_libs.sh
执行完成之后,会输出armeabi-v7a, arm64-v8a,x86,x86_64的so:
将xhook加到项目中
1 将libxhook/libs目录拷贝到项目中
拷贝到CMakeLists.txt文件所在的目录, 一般为app/src/main/cpp中:
2 将xhook.h拷贝到项目中
为了方便配置,直接将xhook.h拷贝到app/src/main/cpp中,和CMakeLists.txt在同级目录:
3 依赖xhook.h写hook的逻辑
#include "xhook.h"static void fake_abort() {LOGI("fake abort");
}static void do_hook() {xhook_register("ibchrome.so", "abort", (void *)fake_abort, nullptr);xhook_refresh(0);
}
编译以上代码,发现链接错误:
[2/2] Linking CXX shared library /home/zhangjg/AndroidStudioProjects/BLEDemo/app/build/intermediates/cmake/debug/obj/arm64-v8a/libble_compat.so
FAILED: /home/zhangjg/AndroidStudioProjects/BLEDemo/app/build/intermediates/cmake/debug/obj/arm64-v8a/libble_compat.so
: && /home/zhangjg/tools/android-ndk-r21/toolchains/llvm/prebuilt/linux-x86_64/bin/clang++ --target=aarch64-none-linux-android26 --gcc-toolchain=/home/zhangjg/tools/android-ndk-r21/toolchains/llvm/prebuilt/linux-x86_64 --sysroot=/home/zhangjg/tools/android-ndk-r21/toolchains/llvm/prebuilt/linux-x86_64/sysroot -fPIC -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -std=c++11 -O0 -fno-limit-debug-info -Wl,--exclude-libs,libgcc_real.a -Wl,--exclude-libs,libatomic.a -static-libstdc++ -Wl,--build-id -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments -shared -Wl,-soname,libble_compat.so -o /home/zhangjg/AndroidStudioProjects/BLEDemo/app/build/intermediates/cmake/debug/obj/arm64-v8a/libble_compat.so CMakeFiles/ble_compat.dir/ble_compat.cpp.o /home/zhangjg/tools/android-ndk-r21/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/26/liblog.so /home/zhangjg/.gradle/caches/transforms-2/files-2.1/bba815dfd2e33446c27bb2585a849af4/jetified-xdl-1.0.4/prefab/modules/xdl/libs/android.arm64-v8a/libxdl.so -latomic -lm && :
CMakeFiles/ble_compat.dir/ble_compat.cpp.o: In function `do_hook()':
/home/zhangjg/AndroidStudioProjects/BLEDemo/app/src/main/cpp/ble_compat.cpp:133: undefined reference to `xhook_register'
/home/zhangjg/AndroidStudioProjects/BLEDemo/app/src/main/cpp/ble_compat.cpp:134: undefined reference to `xhook_refresh'
clang++: error: linker command failed with exit code 1 (use -v to see invocation)
ninja: build stopped: subcommand failed.
我们都知道,c/c++代码的构建分为编译和链接两个部分,编译期间依赖的头文件xhook.h是没有问题的。但是链接的时候,即使我们自己的so是动态链接到libxhook.so,连接器ld也是要找到libxhook.so,去检查libxhook.so中的符号,以确保我们自己的so中的符号,需要做静态链接还是动态链接。
以上错误就是因为链接器不知道去哪里找libxhook.so。
需要在CMakeLists.txt中加入相关的配置:
add_library(xhook SHARED IMPORTED)
set_target_properties(xhook PROPERTIES IMPORTED_LOCATION${PROJECT_SOURCE_DIR}/libs/${CMAKE_ANDROID_ARCH_ABI}/libxhook.so)target_link_libraries(ble_compat xhook)
add_library(xhook SHARED IMPORTED)
这句话的意思是,定义一个库,这个库需要有一个名字xhook
,这个名字可以被其他库依赖。
set_target_properties
这句话是对xhook这个库进行配置,主要是配置它的so的路径。${PROJECT_SOURCE_DIR}
就是当前CMakeLists.txt文件所在的路径app/src/main/cpp
。${CMAKE_ANDROID_ARCH_ABI}
就是当前编译任务对应的abi(armeabi-v7a, arm64-v8a, x86, x86_64)。
上面的两句代码定义了xhook这个库,并且指定了这个库的so的位置。
target_link_libraries(ble_compat xhook)
这句话说明当前的模块ble_compat
需要链接到xhook这个库。
加上上面的代码后,就可以编译通过了。
并且在打包apk的时候,会自动把libxhook.so打进去。
我之前不会配置如何链接外部第三方so,就在网上搜了很多资料,很多都是使用link_directories()
配置的,都不生效。
CMake依赖第三方so库相关推荐
- iOS架构-静态库.a之依赖第三方静态库.a的制作(8)
上一篇讲的是静态库.framework 依赖第三方库,是通过Cocoapod 提供的第三方库.而有时我们会依赖第三方.a 或者.framework 的.那么怎么样来制作依赖第三方.a 或者.frame ...
- android jni通过cmake使用第三方静态库和动态库
google 官方现在推荐使用cmake来构建jni. 本人正好工作需要使用第三方的静态库和动态库,写此文 权当做个记录. 首先修改app的build.gradle文件 ndk {abiFilter ...
- iOS架构-静态库.framework之依赖第三方库(7)
需求分析: 把自己的能力封装成静态库提供给客户使用,但是有些工作市场上已经有很好的公开的代码,或者成本很低的解决方案,我们就可以使用别人公开的.或者低成本采购的技术来为我们服务.制作静态库也是 ...
- (转载)Android studio 导入或依赖第三方库失败
Android studio 导入或依赖第三方库失败 原文链接 在使用第三方库的时候,需要添加很多仓库,以保证可以能正确快速的下载到我们所需要的类库,但是经常会出现各种问题. 以下为个人问题总结 首先 ...
- 【cmake学习】cmake 引入第三方库(头文件目录、库目录、库文件)
程序的编写需要用到头文件,程序的编译需要lib文件,程序的运行需要dll文件,因此cmake引入第三方库其实就是将include目录.lib目录.bin目录引入工程. 目录 1.fin ...
- 使用cmake在自己的jni中倒入第三方so库遇到的问题
在cmake中倒入第三方库的时候遇到问题,记录下来,以便下次查看: 1,这里的路径不能写错 2,为了方便cmake中路径的写入,最好把camkelists提到app目录下 3,第三方的.so库不能带$ ...
- android打包规范包含第三方库aar,Android Studio 打包AAR和第三方静态库(示例代码)
需求 现在有一个第三方库libstatic_add.a和对应的头文件static.h,要求封装一个Module,该Module依赖这个静态库,要求打包的Module包含该静态库. 方案 创建Andro ...
- bazel 链接第三方动态库_Linux 动态库与静态库制作及使用详解
Linux 应用开发通常要考虑三个问题,即:1)在 Linux 应用程序开发过程中遇到过标准库链接在不同 Linux 版本下不兼容的问题: 2)在 Linux 静态库的制作过程中发现有别于 Windo ...
- python第三方库有哪些-我常用的几个第三方 Python 库
我常用的几个第三方 Python 库 今天公司停电,没上班.跑上来更新个博客,跟大家分享一下我常用的几个第三方 Python 库.Python 语言之所以能够如此流行,除了本身内置许多程序库来保障快速 ...
最新文章
- 【跃迁之路】【530天】刻意练习系列289(2018.07.20)
- Django-cookie的保存以及删除操作
- Unity进阶技巧 - 从文件读取游戏数据
- 几道web前端练习题目
- mysql 数据类_MySQL数据类型
- Tensorflow 卷积神经网络(三)池化与采样
- 洛谷 P1843 奶牛晒衣服 1
- 【操作系统/OS笔记11】并发执行的必要性,产生的问题,原子操作,为什么引入锁机制,面包购买的类比
- [学习整理]eclipe/MyEclipse:重要的快捷键
- vb.net 教程 6-1 进程 Process类初探
- 联想智能云教室_被低估的联想能复制微软之路吗? | 公司观察
- stc51单片机串口通信程序
- matlab 维纳滤波器算法实现
- unity让物体做圆周运动、椭圆运动、双曲线运动
- oppo计算机找不到,oppo手机照片在电脑显示不出来怎么办啊
- c语言程序撩女朋友,撩女朋友的套路情话 绝对让她对你死心塌地
- sun.net.ftp.FtpClient介绍
- Vue实战篇三十五:实现滑动拼图验证登录
- python3-张子枫图片爬取
- CanOpen学习笔记5-- CanFestival使用提示