如何在Windows QtCreator中构建可供Android项目调用的C++共享库
问题根源
你遇到的报错本质是链接的libmylibc.so文件格式和当前Qt项目的编译目标架构/平台不匹配,链接器无法识别该文件,具体操作错误点如下:
- 编译MyLibC用的工具链和Qt项目的目标平台不匹配:你自定义的
toolchain.cmake指定了Linux系统、普通gcc/g++编译器,编译出来的是PC端Linux x86/amd64架构的so文件,既不能给Android arm架构用,也不能给Windows平台用。 - .pro文件配置错误:Windows平台下直接将dll写入LIBS配置项,没有使用对应的导入库进行链接;同时没有单独区分Android和普通Linux平台的配置,容易出现配置冲突。
解决步骤
场景1:编译Android版本的Qt项目
- 替换MyLibC的交叉编译工具链:不要用自定义的
toolchain.cmake,直接使用NDK官方提供的CMake工具链,CMake启动参数修改为:
cmake -DCMAKE_TOOLCHAIN_FILE=你的NDK安装路径/build/cmake/android.toolchain.cmake \ -DANDROID_ABI=armeabi-v7a \ # 和Qt Android套件的ABI一致,可选arm64-v8a等 -DANDROID_PLATFORM=android-21 \ # 和Qt的目标安卓版本匹配 -DANDROID_NDK=你的NDK安装路径 \ ..
- 编译得到对应Android架构的
libmylibc.so文件后,替换项目中lib目录下的so文件。 - 修正.pro文件的平台区分配置:
# 全局链接配置通用,不需要分平台写多次 LIBS += -L"$$_PRO_FILE_PWD_/lib" -lmylibc INCLUDEPATH += "$$_PRO_FILE_PWD_/include" android { ANDROID_EXTRA_LIBS=$$_PRO_FILE_PWD_/lib/libmylibc.so } win32 { # Windows下不需要单独加dll到LIBS,自动链接对应.a导入库 } unix:!android { # 普通Linux平台的额外配置写在这里 }
场景2:编译Windows版本的Qt项目
- 重新编译MyLibC,不需要使用Linux交叉编译工具链,直接用和Qt套件一致的MinGW 8.1.0 64位编译,生成
libmylibc.dll和libmylibc.a(导入库)两个文件,放入项目lib目录。 - 删除项目中错误的
libmylibc.so文件,Windows平台不需要so格式的库。 - 沿用上面修正后的.pro配置即可,不需要额外修改。
验证方法
编译完库文件后,可以用MinGW自带的file命令验证文件格式:
- Android arm架构so:输出包含
ELF 32-bit LSB shared object, ARM, EABI5 - Windows dll:输出包含
PE32+ executable (DLL) (console) x86-64, for MS Windows - 普通Linux x86 so:输出包含
ELF 64-bit LSB shared object, x86-64
确认格式和目标平台匹配后再放入Qt项目链接。
内容的提问来源于stack exchange,提问作者Ivan
相关产品推荐
相关产品推荐

