C++Builder 12.2 x64项目链接报错:__guard_check_icall_fptr等符号重复
解决C++Builder 12.2现代64位编译器链接OpenSSL时的重复符号错误
在采用现代64位编译器、使用VC x64编译版本OpenSSL的C++Builder 12.2项目中,编译正常但触发以下链接错误:
ld.lld: error: duplicate symbol: __guard_check_icall_fptr defined at libmingwex.a(lib64_libmingwex_a-mingw_cfguard_support.o) defined at LIBCMT.lib(guard_support.obj) ld.lld: error: duplicate symbol: __guard_dispatch_icall_fptr defined at libmingwex.a(lib64_libmingwex_a-mingw_cfguard_support.o) defined at LIBCMT.lib(guard_support.obj)相同项目使用传统32位及64位编译器可正常编译链接。
项目设置层面的解决办法
- 关闭Control Flow Guard (CFG):这两个重复符号是CFG的支持函数,现代64位编译器默认开启了CFG,而VC编译的OpenSSL也附带了这些符号。打开C++Builder项目设置,找到链接器 -> 高级,把Control Flow Guard设为禁用,重新编译链接即可。
- 调整库链接顺序:在项目链接设置里,把VC编译的OpenSSL库(比如
libssl.lib、libcrypto.lib)挪到系统库前面,让链接器优先采用OpenSSL的符号定义,避免从libmingwex.a中重复引入。 - 排除冲突目标文件:给链接器添加选项
-u __guard_check_icall_fptr -u __guard_dispatch_icall_fptr,强制链接器只采用其中一个符号定义,跳过冲突部分。
OpenSSL编译层面的解决办法
- 编译OpenSSL时禁用CFG:如果不想关掉项目的CFG功能,就重新编译OpenSSL。用VC编译时,配置阶段添加
no-cfguard参数,命令示例:
编译安装后替换项目里的旧OpenSSL库。perl Configure VC-WIN64A no-cfguard --prefix=你的安装路径 - 换用MinGW-w64编译的OpenSSL:放弃VC编译版本,改用MinGW-w64编译的OpenSSL,能减少跨编译器的库符号冲突。
内容的提问来源于stack exchange,提问作者user19840093
相关产品推荐
相关产品推荐

