当前位置:首页 » 编程软件 » 交叉编译静态库

交叉编译静态库

发布时间: 2025-06-16 16:16:39

① 一文搞懂交叉编译/跨平台开发

交叉编译是将代码在不同平台上进行编译、运行程序的技术。常见的平台有基于linux/Unix架构的系统和Windows系统。大部分情况下,交叉编译使用C/C++编写,需具备相关语言背景,并了解CMake及其CMakeLists撰写。

在进行交叉编译时,关键在于指定编译工具链。C和C++的编译工具链分别用CMAKE_C_COMPILER和CMAKE_CXX_COMPILER表示。通常在自己的机器上使用CMake编译代码时,会使用特定的编译工具链,如Ubuntu机器上用gcc。在不同平台上,需下载对应平台的编译工具链。如在Ubuntu机器上编译Arm-Linux版本,只需在cmake时指定对应的编译工具链。

动态库与静态库的区别在于,动态库在运行时加载,静态库则直接打包进可执行文件。CMake默认编译静态库,如需编译动态库,需在CMakeLists.txt中指定为“SHARED”。在使用动态库时,需确保动态库的位置已知。在Linux下,需指定动态库位置,Windows下需将动态库.DLL放置在可执行文件的同一目录下。

Windows平台与其他几个平台在编译与动态库使用上有显着不同。Windows下编译动态库后会生成DLL和LIB文件。在CMakeList中需指定。在执行阶段,将mylib.dll与demo.exe放在同一路径下执行。Windows下的动态库默认隐藏符号,因此需要暴露的符号需用__declspec(dllexport)标记,如函数、struct等。

SSH问题可能导致使用curl触发网络请求时出现status code为0的情况,这通常由SSH引起。注意排除此类问题以避免混淆。

② CMake搭建编译环境总结

目录


前言
交叉编译环境搭建是嵌入式开发者面对的常见挑战,主要涉及在目标平台(如Arm板)上编译代码的过程。常见的编译工具包括Makefile和CMake。本文将总结CMake在搭建编译环境时的常用技巧。

入门案例:单个源文件


代码路径: 代码路径链接

工程结构


在开始使用CMake之前,需要构建工程结构,包括文件、目录和CMakeLists.txt文件。


工程编译


完成CMakeLists.txt文件编写后,执行cmake命令(指定路径),然后使用make命令编译。


多个源文件


代码路径: 代码路径链接

工程结构


当工程包含多个文件和目录时,使用一个CMakeLists.txt文件可能难以维护。因此,建议按照模块结构,为每个主要模块创建单独的CMakeLists.txt文件,将文件和目录按层次嵌套管理。


优点


顶层CMakeLists.txt负责设置工程属性、交叉工具和包含子路径的CMakeLists.txt文件。子路径下的CMakeLists.txt主要关注编译文件的路径、目标生成路径和编译目标。


配置示例


配置顶层CMakeLists.txt时,应包含工程属性、交叉工具设置和包含子路径的CMakeLists文件。子路径下的CMakeLists.txt应关注头文件路径、目标生成路径和编译目标。


其他用法


配置局部变量、设置全局变量、获取全局变量、指定目标输出路径、设置环境变量等。


环境设置和编译器配置


设置环境变量、编译器路径、依赖库路径、头文件路径、编译器编译选项、CMakeLists路径嵌套等。


编译警告和报错设置


使用GCC设置编译警告和报错选项,例如打开所有警告并将其视为错误。


交叉编译环境设置


配置默认库、头文件搜索路径、交叉编译工具链、浮点运算处理方式、动态库编译、静态库编译和可执行文件编译。


③ Android 编译 FFmpeg 6.0 - 支持MediaCodec编解码

在Android上编译FFmpeg 6.0版本,已成功集成MediaCodec编解码支持,包括H264和H265编码。以下是编译和集成的详细步骤:

首先,使用Macos 13.2的GCC、Cmake和NDK 21的交叉编译环境,构建了x264、mp3lame、fdk-aac和opencore-amr等第三方库。FFmpeg 6.0版本默认支持MediaCodec硬件加速,无需额外开启,加速选项包括在内。

配置编译时,选择静态链接库,禁用avdevice和postproc模块,以减少生成的.a文件数量。为了方便,可以编写脚本自动化configure和make命令。编译过程中,遇到x264的pkg-config问题,需要指定其位置。

通过ld工具,将所有静态库合并成一个libffmpeg-org.so文件,便于使用。合并配置中需注意使用libgcc_real.a,而不是libgcc.a,以适应NDK 21环境。编译完成后,将库文件和头文件添加到Android项目中,配置CmakeLists.txt并实现FFmpegCmd类以调用MediaCodec功能。

开源库FFmpegCommand提供了基础的音视频处理功能,包括FFmpegUtils命令和自定义MediaCodec操作的示例。在实际测试中,使用MediaCodec编码的效率更高,建议优先使用。

总的来说,FFmpeg 6.0的MediaCodec集成已经成功,可用于Android项目的音视频编解码。通过简单的配置和集成,即可享受MediaCodec带来的性能优势。

④ 如何在windows上用ndk交叉编译其他平台程序

目标 :编译arm64的.so库

编译方法:理论上应该有两种交叉编译方法,法一,在Linux服务器上安装交叉工具链,直接用交叉工具链进行编译链接;法二,使用ndk完成交叉编译,因为

ndk已经安装好交叉编译工具链,以及相关的系统库和系统头文件了。这两种方法的区别在于,linux服务器上的编译使用的makefile和ndk使用的.mk
文件显然不同。原因是ndk作为一个集成编译环境,制定了一套特定的规则用于生成最终的编译脚本。

这里简单总结下,如何在windows用ndk进行交叉编译arm64目标平台的.so库:

step1:找到ndk开发工具包,官网之类的都可以下载,Android-ndk64-r10-windows-x86_64.rar文件

step2:解压上述ndk工具包,将包含程序源文件和头文件的文件夹testProject都放入android-ndk-r10下的samples目录下。

放在其他地方当然也可以,但是后续相对路径之类的不太好加,既然其他例子都放这,把代码放这编译是最保险的了。

step3:在testProject中增加一个jni的文件夹,必须要添加!!!!!!

step4:在jni文件夹中,添加一个Android.mk的文件,必须要添加!!!!!

step5:在jni文件夹中,添加一个Application.mk的文件与Android.mk并列,必须要添加!!!!!

step6:Android.mk和Application.mk合起来就类似于linux环境下的makefile编译文件。

如何写Android.mk,可以参考例子helllo-jni中jni文件夹下的Android.mk。

LOCAL_PATH:=$(call my-dir) #必须要写的

include $(CLEAR_VARS) #必须要写的

LOCAL_MODULE:=hello-jni #编译出来的模块名称

LOCAL_SRC_FILES:=hello-jni.c #制定编译的源文件名称

include $(BUILD_SHARED_LIBRARY)#放在最后

除了上述变量之外,还有其他的指定的变量,

LOCAL_CFLAGS,用于指定编译选项,这个和makefile中是完全一样的,可以指定编译选项-g,也可以指定编译宏及宏值

LOCAL_LDLIBS,用于指定链接的依赖库,这个可以makefile也是完全一样的,可以指定链接库用-l库名,以及指定库搜索路径用_L路径名

LOCAL_STATIC_LIBRARIES,指定链接的静态库名,makefile中没有

LOCAL_C_INCLUDES,用于指定编译头文件的路径,和makefile中不同,路径前不需要加-I,直接写路径即可,可以是相对路径或绝对路径,

多个路径之间用空格隔开。

编写上述Android.mk碰到的问题有,

(1)使用默认的系统自动加载stl库头文件总是出错,只好手动在LOCAL_STATIC_LIBRARIES指定sources/cxx-stl/stlport/stlport来完成对#include<string>这种c++形式的头文件加载

(2)使用$(SYSROOT)/usr/include来完成对系统库头文件的加载,结果找不到sem_t符号,只好指定platforms/android-L/arch-arm64/usr/include

step7:Application.mk编写

APP_STL指定使用的stl移植库,动态或者静态都行

APP_CPPFLAGS,指定app编译的编译选项

APP_ABI指定abi规范类型,例如arm64-v8a,也可以写成ALL就是把所有的类型全部编一编

APP_PLATFORM指定编译的platform名称,这里可以写成android-L或者不指定全编。

step8:编译完成后,运行。

启动cmd,使用cd /D进行到testProject的jni目录下

step9:将android-ndk-r10下的ndk-build.cmd直接拖拽到cmd中,此时直接敲回车,就可以编译了。当然也可以加一个 clean,清除编译中间文件。

step10:检查下编译结果,编译成功后在testProject中多了两个文件夹与jni并列的,libs和obj。
编译链接后的结果就在libs中!

⑤ Linux 交叉编译FFmpeg库

Linux 交叉编译FFmpeg库

配置环境

在Linux上配置NDK环境和FFmpeg,首先下载并解压NDK,配置/etc/profile的环境变量,然后下载FFmpeg,解压后使用./configure --help查看帮助文档。

FFmpeg包含libavformat、libavcodec、libavutil、libswscale、libpostproc等模块,为各种音视频封装格式的生成和解析、声音/图像编解码、公共工具函数、视频场景比例缩放和色彩映射转换、后期效果处理以及工具和服务器等。

编写编译脚本

定义NDK路径,指定GCC路径,设置FLAGS结合Linux环境修改,参考externalNativeBuild/xxx/build.ninja的传参内容。学习资料推荐,免费报名学习音视频知识,资料包括C/C++、Linux、FFmpeg等。

配置参数

优化大小、不编译ffmpeg程序(命令行工具)、关闭avdevice模块、关闭所有编码器、关闭所有复用器、关闭所有滤镜、开启交叉编译、设置GCC的前缀、关闭动态库、开启静态库、传给gcc的参数等。

执行make完成编译输出

编写脚本过程中注意关闭asm、权限要求、手动创建输出文件夹、命令行格式等。

移植到Android项目中使用

创建NDK项目,将编译好的include文件夹复制到/src/main/cpp目录下,将ffmpeg lib目录下的文件复制到armeabi-v7a目录下,Cmake文件中引入库,即可愉快使用FFmpeg库。

FFmpeg是纯C的库,需要在代码中进行引用。显示ffmpeg版本号完成整个流程。

至此,Linux交叉编译FFmpeg库的流程介绍完成。

⑥ 交叉编译时提示 对'__C_ctype_b'的未定义引用

出现这种情况的原因,主要是C/C++编译为obj文件的时候并不旅卖需要函数的具体实现,只要有函数的原型即可。但是在链接为可执行文件的时候就必须要具体的实现了。如果错误是未声明的引用,那就是找不到函数的原型,解决办法这里就不细致说了,通常是相关的头文件未包含。
解决办法
指定原因就好办了,既然知道是缺少了函数的喊昌具体实现,那么就给它这个函数的实现就好了。比如上面的例子,是因为缺失了dlopen、dlsym、dlerror、dlclose这些函数的实现,这几个函数是用于加载动态链接库的,编译的时候需要添加-ldl来使用dl库(这是静态库,在系统目录下/usr/lib/i386-linux-gnu/libdl.a、/usr/lib/x86_64-linux-gnu/libdl.a)。
但是看上面编译的时候是有添加-ldl选项的,那么为什么不行呢?
gcc 依赖顺序问题
这个主要的原因是gcc编译的时候,各个文件依赖顺序的问题。
在gcc编译的时候,如果文件a依赖于文件b,那么编译的时候必须把a放前面,b放后面。
例如:在main.c中使用了pthread库相关函数,那么编译的时候必须是main.c在前,-lpthread在后。gcc main.c -lpthread -o a.out。
上面拆渗逗出现问题的原因就是引入库的顺序在前面了,将其放置在后面即可了。
g++ -o spider bloomfilter.o confparser.o crc32.o dso.o hashs.o md5.o qstring.o sha1.o socket.o spider.o threads.o url.o -rdynamic -lpthread -levent -lcrypt -ldl

热点内容
java动态调用 发布:2025-06-16 22:37:02 浏览:840
u盘linux格式 发布:2025-06-16 22:22:54 浏览:967
如何找回期货账号密码 发布:2025-06-16 22:21:36 浏览:14
8个手机文件夹名称连续 发布:2025-06-16 22:07:27 浏览:889
ubuntu在硬盘上编译卡死 发布:2025-06-16 22:06:41 浏览:89
搭建git服务器centos 发布:2025-06-16 22:06:27 浏览:678
联盟和糖豆人哪个配置高 发布:2025-06-16 22:04:47 浏览:339
targz解压windows 发布:2025-06-16 21:17:34 浏览:803
梦幻手游桌面内置脚本 发布:2025-06-16 21:15:18 浏览:662
奔驰车如何使用安卓手机投屏 发布:2025-06-16 21:13:51 浏览:100