Android NDK编译mysql-connector-cpp遇两类错误求助
编译MySQL Connector/C++ for Android x86_64的两个问题及解决方法
问题1:struct __res_state 类型不完整错误
编译时触发如下错误:
/home/ripper/sources_pck/mysqlcpp/mysql-connector-cpp/cdk/foundation/socket_detail.cc:1097:22: error: variable has incomplete type 'struct __res_state' 1097 | struct __res_state state {}; | ^ /home/ripper/sources_pck/mysqlcpp/mysql-connector-cpp/cdk/foundation/socket_detail.cc:1097:10: note: forward declaration of '__res_state'
解决方法
- 方法一:修改源码补全头文件
打开cdk/foundation/socket_detail.cc,在文件头部添加头文件引用:#include <resolv.h> - 方法二:补充NDK头文件路径
若resolv.h位于NDK的x86_64-linux-android子目录下,修改CMake的CMAKE_CXX_FLAGS参数,添加对应路径:-DCMAKE_CXX_FLAGS="-I/home/ripper/android-ndk/android-ndk-r27c/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include -I/home/ripper/android-ndk/android-ndk-r27c/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/x86_64-linux-android"
问题2:Android版protoc无法在Linux主机执行的错误
编译时出现protoc: not found或依赖错误,原因是预编译的Android版protoc为Android系统专属ELF格式(解释器为/system/bin/linker64),无法在Linux主机环境运行。
解决方法
需分别编译Linux主机版protoc工具和Android x86_64版Protobuf库:
编译Linux主机版protoc
下载Protobuf源码后,执行以下命令生成可在Linux运行的protoc:mkdir protobuf-host-build && cd protobuf-host-build cmake ../protobuf-src \ -DCMAKE_BUILD_TYPE=Release \ -Dprotobuf_BUILD_SHARED_LIBS=OFF \ -Dprotobuf_BUILD_TESTS=OFF \ -DCMAKE_INSTALL_PREFIX=/home/ripper/sources_pck/protobuf-host make -j$(nproc) && make install编译Android x86_64版Protobuf库
基于同一Protobuf源码,编译针对Android的库(不生成Android版protoc):mkdir protobuf-android-build && cd protobuf-android-build cmake ../protobuf-src \ -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK_ROOT/build/cmake/android.toolchain.cmake \ -DANDROID_ABI=x86_64 \ -DANDROID_PLATFORM=android-34 \ -DCMAKE_BUILD_TYPE=Release \ -Dprotobuf_BUILD_SHARED_LIBS=OFF \ -Dprotobuf_BUILD_TESTS=OFF \ -Dprotobuf_BUILD_PROTOC_BINARIES=OFF \ -DCMAKE_INSTALL_PREFIX=/home/ripper/sources_pck/android_libs/protobuf-android-x86_64 make -j$(nproc) && make install更新MySQL Connector/C++的CMake参数
在原有编译命令基础上,添加指定主机版protoc路径和Android版Protobuf库的参数:cmake .. \ -DCMAKE_C_COMPILER=$ANDROID_NDK_ROOT/toolchains/llvm/prebuilt/linux-x86_64/bin/clang \ -DCMAKE_CXX_COMPILER=$ANDROID_NDK_ROOT/toolchains/llvm/prebuilt/linux-x86_64/bin/x86_64-linux-android34-clang++ \ -DCMAKE_C_FLAGS="-I/home/ripper/android-ndk/android-ndk-r27c/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include" \ -DCMAKE_CXX_FLAGS="-I/home/ripper/android-ndk/android-ndk-r27c/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include" \ -DANDROID_ABI=x86_64 \ -DANDROID_PLATFORM=android-34 \ -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK_ROOT/build/cmake/android.toolchain.cmake \ -DCMAKE_INSTALL_PREFIX=/home/ripper/sources_pck/android_libs/mysql-connector-cpp \ -DWITH_SSL=/home/ripper/sources_pck/android_libs/openssl-3.4.0-android/lib/libssl \ -DCMAKE_BUILD_TYPE=Release \ -DWITH_UNIT_TESTS=OFF \ -DWITH_EXAMPLES=OFF \ -DWITH_JDBC=OFF \ # 新增参数 -Dprotobuf_PROTOC_EXECUTABLE=/home/ripper/sources_pck/protobuf-host/bin/protoc \ -Dprotobuf_LIBRARY=/home/ripper/sources_pck/android_libs/protobuf-android-x86_64/lib/libprotobuf-lite.a \ -Dprotobuf_INCLUDE_DIR=/home/ripper/sources_pck/android_libs/protobuf-android-x86_64/include
内容的提问来源于stack exchange,提问作者Ripper
相关产品推荐
相关产品推荐

