如何控制SCons环境检测选项以编译MongoDB 4.2?
解决Arch Linux上SCons构建MongoDB 4.2的OpenSSL依赖问题
核心问题拆解
- Arch默认的OpenSSL 3.0和MongoDB 4.2不兼容,必须指定OpenSSL 1.1的路径
- SCons的
Conftest检测环节不直接继承普通的CFLAGS/CCFLAGS参数,常规参数传递无效 - 额外存在
-Wno-exceptions选项误用的问题:该选项仅适用于C++编译,却被加到了C编译命令中,且警告被强制转为错误导致构建中断
可行解决方案
方法一:直接给SCons传递MongoDB预定义的OpenSSL路径变量
MongoDB的SConstruct脚本预留了专门的变量用于指定OpenSSL路径,执行构建时直接传入即可:
scons OPENSSL_INCLUDE_DIR=/usr/include/openssl-1.1 OPENSSL_LIB_DIR=/usr/lib/openssl-1.1
如果需要链接静态库,再加个OPENSSL_STATIC=1参数就行。
方法二:通过系统环境变量强制指定OpenSSL 1.1优先级
先设置环境变量让编译器优先找到OpenSSL 1.1的头文件和库,再启动SCons:
export C_INCLUDE_PATH=/usr/include/openssl-1.1:$C_INCLUDE_PATH export LIBRARY_PATH=/usr/lib/openssl-1.1:$LIBRARY_PATH export LD_LIBRARY_PATH=/usr/lib/openssl-1.1:$LD_LIBRARY_PATH scons
这种方式会让整个构建流程的编译器都默认用指定的OpenSSL版本。
方法三:同时修复警告转错误和选项误用问题
如果不想临时改全局环境,可以结合路径参数和编译选项调整,关闭警告转错误规则并修正参数:
scons OPENSSL_INCLUDE_DIR=/usr/include/openssl-1.1 OPENSSL_LIB_DIR=/usr/lib/openssl-1.1 CCFLAGS="-Wno-error -Wno-exceptions"
-Wno-error会暂时关闭“警告视为错误”的规则,避免因其他小警告卡壳;如果确认只有-Wno-exceptions的问题,也可以单独针对C编译过滤该选项,但这种方式最简单直接。
验证路径有效性
执行构建前可以先手动测试gcc是否能找到正确的crypto.h:
gcc -I/usr/include/openssl-1.1 -c -x c - <<EOF #include <openssl/crypto.h> int main() { return 0; } EOF
如果编译无报错,说明路径设置正确,再用上述SCons命令构建即可。
内容的提问来源于stack exchange,提问作者Antoine
相关产品推荐
相关产品推荐

