如何在64位Linux机器上用CMake构建32位mongo-c-driver?
解决64位Linux构建32位mongo-c-driver时链接错误问题
问题场景
在64位Linux机器上,使用-DCMAKE_TOOLCHAIN_FILE参数构建32位mongo-c-driver,已安装所有i386架构依赖包,但构建时出现链接错误:
/usr/bin/ld: /usr/lib/x86_64-linux-gnu/libssl.so: error adding symbols: file in wrong format collect2: error: ld returned 1 exit status gmake[2]: *** [src/libmongoc/CMakeFiles/mongoc_shared.dir/build.make:2012: src/libmongoc/libmongoc-1.0.so.0.0.0] Error 1 gmake[1]: *** [CMakeFiles/Makefile2:1566: src/libmongoc/CMakeFiles/mongoc_shared.dir/all] Error 2 gmake: *** [Makefile:171: all] Error 2
错误原因
CMake未正确识别i386架构的依赖库,仍在尝试链接64位版本的libssl.so。
解决步骤
1. 修正工具链文件
确保你的CMake工具链文件(比如toolchain-i386.cmake)包含以下关键配置,强制使用32位编译环境:
# 指定目标架构为32位 SET(CMAKE_SYSTEM_PROCESSOR i386) SET(CMAKE_C_FLAGS "-m32" CACHE STRING "32-bit C flags") SET(CMAKE_CXX_FLAGS "-m32" CACHE STRING "32-bit C++ flags") # 优先查找i386架构的库 SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) SET(CMAKE_LIBRARY_PATH /usr/lib/i386-linux-gnu) # 指定32位编译器 SET(CMAKE_C_COMPILER gcc) SET(CMAKE_CXX_COMPILER g++)
2. 手动指定OpenSSL依赖路径
在cmake命令中添加参数,明确指向i386版本的OpenSSL库:
cmake .. -DCMAKE_TOOLCHAIN_FILE=toolchain-i386.cmake \ -DOPENSSL_ROOT_DIR=/usr/lib/i386-linux-gnu \ -DOPENSSL_LIBRARIES=/usr/lib/i386-linux-gnu/libssl.so \ -DOPENSSL_INCLUDE_DIR=/usr/include/i386-linux-gnu
3. 清理构建环境重新编译
清理之前生成的构建文件,避免缓存干扰:
rm -rf build && mkdir build && cd build # 重新运行上述cmake命令,再执行编译 gmake
内容的提问来源于stack exchange,提问作者morioki
相关产品推荐
相关产品推荐

