编译带Kerberos支持的Mongo C Driver时遇未定义引用错误求助
解决Mongo C Driver 1.10.3编译时的未定义引用问题(Ubuntu 16.04 + Kerberos支持)
从你贴出的错误日志来看,这些未定义引用主要分成两类:一类是OpenSSL新版本API的调用(比如OPENSSL_init_ssl、TLS_method),另一类是C++标准库的核心符号(比如operator new、std::__cxx11::basic_string相关)。结合你的Ubuntu 16.04环境,我给你整理了一套完整的解决步骤:
1. 补全系统依赖包
Ubuntu 16.04默认的依赖包可能不全,先执行下面的命令安装所有必需的编译依赖:
sudo apt-get update sudo apt-get install -y build-essential cmake libssl-dev libkrb5-dev libsasl2-dev libcurl4-openssl-dev pkg-config
每个包的作用:
build-essential:补上gcc、g和C标准库,解决那些C++相关的未定义引用libssl-dev:提供OpenSSL的头文件和静态库,修复OpenSSL API的链接问题libkrb5-dev:开启Kerberos支持的核心依赖,必须安装libsasl2-dev:可选但推荐,用来配合Kerberos实现SASL认证libcurl4-openssl-dev:驱动内部HTTP功能需要的依赖
2. 调整CMake编译参数
你之前的命令没显式开启Kerberos,也没强制链接C++库,建议换成下面的CMake命令:
cmake -DENABLE_AUTOMATIC_INIT_AND_CLEANUP=OFF \ -DENABLE_KERBEROS=ON \ -DCMAKE_EXE_LINKER_FLAGS="-lstdc++" \ ..
参数说明:
-DENABLE_KERBEROS=ON:明确告诉CMake要开启Kerberos支持,避免自动检测失败-DCMAKE_EXE_LINKER_FLAGS="-lstdc++":强制链接C++标准库,解决那些std::__cxx11相关的符号缺失
如果你的系统里装了多个版本的OpenSSL(比如手动安装过高版本),可以再加个参数指定系统默认的OpenSSL路径,避免链接错误:
cmake -DENABLE_AUTOMATIC_INIT_AND_CLEANUP=OFF \ -DENABLE_KERBEROS=ON \ -DCMAKE_EXE_LINKER_FLAGS="-lstdc++" \ -DCMAKE_PREFIX_PATH=/usr/lib/x86_64-linux-gnu/ \ ..
3. 重新编译安装
先清理之前的编译残留,再编译安装:
make clean make -j$(nproc) sudo make install
make clean:清除上次编译生成的中间文件,避免缓存导致的问题-j$(nproc):利用所有CPU核心编译,提升编译速度
这样应该就能解决你遇到的链接错误了。
内容的提问来源于stack exchange,提问作者leao
相关产品推荐
相关产品推荐

