VS2017链接OpenSSL时LIBCMTD冲突警告问题求助
解决VS2017 + OpenSSL /MDd编译的LNK4098冲突警告
1. 重新生成OpenSSL配置,显式指定CRT编译选项
别再事后修改makefile了,直接在Configure阶段把/MDd传入CFLAGS,确保所有编译目标都统一使用多线程调试DLL CRT:
perl Configure Debug-VC-WIN32 no-shared no-stdio no-ui no-filenames no-engine no-dso no-idea no-sock --prefix=some_path --openssldir=some_path CFLAGS="/MDd /Zi /Fdossl_static /Zl"
这样Configure会直接生成包含/MDd的全量编译选项,不会遗漏其他依赖CRT设置的变量。
2. 彻底清理并重新编译OpenSSL
之前的编译产物大概率残留了旧的CRT依赖,先执行清理:
nmake clean
然后重新编译安装:
nmake nmake install
3. 检查并统一VS项目的CRT设置
打开你的VS2017项目属性,做这几项确认:
- 进入C/C++ -> 代码生成 -> 运行时库,确认选中
多线程调试 DLL (/MDd) - 进入链接器 -> 输入 -> 附加依赖项,添加编译好的OpenSSL静态库(一般是
libcrypto.lib和libssl.lib) - 如果警告还没消失,进入链接器 -> 命令行,在附加选项里加:
这会强制忽略冲突的静态CRT库,确保只链接/MDd对应的动态CRT。/NODEFAULTLIB:LIBCMTD
4. 手动修改makefile的补漏方案(如果仍想用这种方式)
如果坚持手动改makefile,除了LIB_CFLAGS,还要把所有带/MT或/MTd的行都替换成/MDd,比如:
CFLAGS、CFLAGSDAPP_CFLAGS、APP_CFLAGSDTEST_CFLAGS、TEST_CFLAGSD
Debug模式下统一用/MDd,避免局部编译选项不一致导致的冲突。
内容的提问来源于stack exchange,提问作者wxShayan
相关产品推荐
相关产品推荐

