交叉编译cpr库时C++版本不匹配问题求助
交叉编译cpr库后运行出现CXXABI/GLIBCXX版本缺失错误
问题描述
编译链接cpr库及依赖的静态curl均正常,但运行程序时触发以下错误:
/tmp/[project name]: /usr/lib/libstdc++.so.6: version 'CXXABI_1.3.11' not found (required by /tmp/[project name] /tmp/[project name]: /usr/lib/libstdc++.so.6: version 'GLIBCXX_3.4.26' not found (required by /tmp/[project name]
程序会尝试调用主机/usr/lib下的libstdc++.so.6,而非目标架构的库,使用VisualGDB Verbose模式也无法追踪原因。仅调用cpr的Post方法就触发错误,编译链接无报错但无法执行代码。
已完成的配置
curl交叉编译配置
已交叉编译静态curl(禁用多数功能),示例可正常运行,configure命令:
sudo ./configure --host=arm-linux-gnueabihf --build=x86_64-linux-gnu --without-ssl --disable-ipv6 --without-brotli --without-libpsl --without-nghttp2 --without-ngtcp2 --without-zstd --without-libidn2 --without-librtmp --without-zlib --disable-shared --enable-static --disable-threaded-resolver --disable-pthreads --prefix=/usr/arm-linux-gnueabihf AR=arm-linux-gnueabihf-gcc-ar-9 RANLIB=arm-linux-gnueabihf-gcc-ranlib-9 CC=/usr/bin/arm-linux-gnueabihf-gcc-9 CXX=/usr/bin/arm-linux-gnueabihf-g++ LD=arm-linux-gnueabihf-ld AS=arm-linux-gnueabihf-gcc-as CROSS_COMPILE=arm-linux-gnueabihf CFLAGS=-I/usr/arm-linux-gnueabihf/include LDFLAGS=-L/usr/arm-linux-gnueabihf/lib PATH=$PATH:/usr/arm-linux-gnueabihf/bin
环境参数:
LDFLAGS=-L/usr/arm-linux-gnueabihf/lib CPPFLAGS=-I/usr/arm-linux-gnueabihf/include PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/usr/arm-linux-gnueabihf/bin:/usr/arm-linux-gnueabihf/bin
编译后链接到/usr/arm-linux-gnueabihf/lib/libcurl.a。
cpr编译配置
cmake命令:
sudo cmake -DCURL_LIBRARY=/usr/arm-linux-gnueabihf/lib -DCURL_INCLUDE_DIR=/usr/arm-linux-gnueabihf/include -DCMAKE_INSTALL_PREFIX=/usr/arm-linux-gnueabihf -DCMAKE_TOOLCHAIN_FILE=/home/[username]/include/toolchain.cmake -DCPR_ENABLE_SSL=OFF -DCURL_ZLIB=OFF -DCPR_USE_SYSTEM_CURL=ON -DBUILD_SHARED_LIBS:BOOL=OFF --debug-output ..
工具链文件内容(存在语法错误):
set(CMAKE)SYSTEM)NAME Linux) set(CMAKE_C_COMPILER arm-linux-gnueabihf-gcc-9) set(CMAKE_CXX_COMPILER arm-linux-gnueabihf-g++) set(CMAKE_FIND_ROOT_PATH /usr/bin)
编译参数
- 链接库:
pthread curl cpr - CFLAGS:
-ggdb -ffunction-sections -O0 -DCURL_STATICLIB -I/usr/arm-linux-gnueabihf/include - CXXFLAGS:
std=gnu++2a -ggdb -ffunction-sections -O0 -DCURL_STATICLIB -I/usr/arm-linux-gnueabihf/include
已尝试C++17/14/11标准,均无效;也试过cpr 1.9.7、curl 7.68.0低版本,问题依旧。
测试代码
const std::string role; cpr::Response response = cpr::Post(cpr::Url{"192.168.1.2/login"},cpr::Payload{{role, "password"}});
已尝试的无效操作
- 添加
-static、-Bstatic、-static-libc++编译参数,无效果; - 尝试显式链接
pthread.a失败; - 显式链接
libcurl.a出现GLIBC相关错误; - 显式链接
libcpr.a或同时链接libcurl.a+libcpr.a仍出现版本错误; - 链接
/usr/lib/gcc-cross/arm-linux-gnueabihf/9/libstdc++.a,仅出现curl_mime_type未定义符号错误(未链接静态curl)。
解决建议
1. 修复工具链文件的核心错误
工具链文件存在语法错误,且根路径配置错误,修正后内容:
set(CMAKE_SYSTEM_NAME Linux) set(CMAKE_SYSTEM_PROCESSOR arm) set(CMAKE_C_COMPILER arm-linux-gnueabihf-gcc-9) set(CMAKE_CXX_COMPILER arm-linux-gnueabihf-g++) # 指定目标架构根路径,让CMake优先查找目标库和头文件 set(CMAKE_FIND_ROOT_PATH /usr/arm-linux-gnueabihf) # 禁止在主机系统查找程序、库、头文件 set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
2. 强制静态链接目标架构的libstdc++
编译时添加-static-libstdc++ -static-libgcc参数,确保链接交叉编译器提供的静态libstdc++,而非动态链接主机库。可在CMake中添加:
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static-libstdc++ -static-libgcc")
或直接在CXXFLAGS/LDFLAGS中追加该参数。
3. 修正cpr的CMake配置
CURL_LIBRARY需指定具体静态库路径而非目录,避免CMake误选动态库;确保BUILD_SHARED_LIBS=OFF生效。修改后的cmake命令:
sudo cmake -DCURL_LIBRARY=/usr/arm-linux-gnueabihf/lib/libcurl.a -DCURL_INCLUDE_DIR=/usr/arm-linux-gnueabihf/include -DCMAKE_INSTALL_PREFIX=/usr/arm-linux-gnueabihf -DCMAKE_TOOLCHAIN_FILE=/home/[username]/include/toolchain.cmake -DCPR_ENABLE_SSL=OFF -DCURL_ZLIB=OFF -DCPR_USE_SYSTEM_CURL=ON -DBUILD_SHARED_LIBS=OFF --debug-output ..
4. 验证二进制依赖
用交叉编译工具检查生成的二进制依赖,确认是否仍链接主机库:
arm-linux-gnueabihf-readelf -d /tmp/[project name]
5. 统一交叉编译工具链环境变量
确保所有编译工具均为交叉版本,避免主机工具参与链接:
export AR=arm-linux-gnueabihf-ar export RANLIB=arm-linux-gnueabihf-ranlib export LD=arm-linux-gnueabihf-ld
内容的提问来源于stack exchange,提问作者13372277
相关产品推荐
相关产品推荐

