C++Builder 11 Alexandria启用CodeGuard时链接报未解析外部符号错误
C++Builder 11 Alexandria 启用CodeGuard链接失败解决方案
这个问题不是个人配置遗漏导致的,核心原因是手动生成导入库的操作逻辑错误,加上部分版本IDE存在默认部署缺陷。
报错本质
你看到的所有未解析外部符号,都是开启CodeGuard后编译器自动插桩到obj文件里的桩函数引用,具体包括:
_CG_DESC_CG_THIS_CG_DTORTHIS_CG_DA_EPY_CG_A_BP_CG_A_PY_CG_GDA_EGY
这些符号根本不是从cg32.dll导出的,而是由CodeGuard配套的静态接入库提供,因此用implib从cg32.dll生成lib的操作从逻辑上就不可能解决问题,无论加-a-c-f哪种参数组合,生成的导入库都不会包含这些桩函数的实现。
正确解决步骤
- 先确认编译目标为Win32平台:CodeGuard从未提供过Win64平台支持,只要切换到Win64目标开启CodeGuard必然报这类链接错误。
- 放弃手动生成cg32.lib的操作:系统目录下的cg32.dll是运行时依赖,只包含运行时功能导出,不提供编译期插桩需要的桩函数实现。
- 通过IDE选项自动配置依赖:打开项目选项,定位到
C++ Compiler -> Compiling页,将CodeGuard support设置为True,正常情况下IDE会自动将官方提供的正确cg32.lib加入链接输入列表,不需要手动添加文件。 - 自动配置失效时手动指定官方库路径:随IDE发布的正确cg32.lib位于安装目录下
$(BDS)\lib\win32\release\psdk\cg32.lib,直接将该路径添加到项目链接器的附加输入列表即可,不要用自行生成的文件替换这个官方库。 - 全量清理后重编译:删除项目目录下所有Win32平台的Debug/Release输出文件夹,清除所有obj、tds、ilc、ild、ilf、ils中间文件,重新执行完整编译。
特殊版本兼容说明
C++Builder 11 Alexandria的初始发布版本存在官方安装包部署bug,会遗漏lib目录下的cg32.lib文件,安装IDE官方后续发布的补丁包后,该文件会被自动补全到对应路径,不需要手动生成或拷贝文件。
注意:不要将系统SysWOW64/System32目录下的cg32.dll拷贝到项目目录,也不要用自行生成的导入库覆盖IDE自带的cg32.lib,否则会出现链接失败或运行时随机崩溃的问题。
内容的提问来源于stack exchange,提问作者Mark Di Val
相关产品推荐
相关产品推荐

