You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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参数,命令示例:
    perl Configure VC-WIN64A no-cfguard --prefix=你的安装路径
    
    编译安装后替换项目里的旧OpenSSL库。
  • 换用MinGW-w64编译的OpenSSL:放弃VC编译版本,改用MinGW-w64编译的OpenSSL,能减少跨编译器的库符号冲突。

内容的提问来源于stack exchange,提问作者user19840093

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 04:49:53