XE6 Ansi/Unicode 字符串链接器错误(未解决的外部问题)

Posted

技术标签:

【中文标题】XE6 Ansi/Unicode 字符串链接器错误(未解决的外部问题)【英文标题】:XE6 Ansi/Unicode-String Linker Errors (Unresolved Externals) 【发布时间】:2014-06-27 08:41:04 【问题描述】:

我的方案是将我的项目从 XE3 移植到 XE6。

当我将调用约定从 C 切换到 stdcall 时,我遇到了这些未解决的外部变量。

从那里开始,UnicodeString()、~UnicodeString()(任何其他)变得无法解析。

我会比较 XE3 和 XE6 之间的 ustring.h。看起来那里有很多变化。

例如:UnicodeString 析构函数。

在 XE3 中,它被标记为:

  __fastcall ~UnicodeString();

在 XE6 中,它被标记为:

  ~UnicodeString();

我将声明修改为:

  __cdecl ~UnicodeString();

这更正了链接器错误。

这是正常的吗,是正确的纠正吗?

获取问题:

创建一个新的 C++ 包; 创建一个从 TEdit 派生的新组件,并将其添加到 包。 构建和链接 => 一切正常; 然后转到项目选项,并将调用约定切换到 stdcall; 构建和链接 => 出现未解决的外部问题;

提前感谢您的回答。

N。福丁

【问题讨论】:

我建议您将此作为回归错误提交给QualityCentral。由于兼容性类(如UnicodeString)是在预编译的 RTL 中实现的,因此标头需要与使用的实际调用约定相匹配,否则您会得到这些链接器错误,而不是 C++ 编译器想要使用的错误。早期版本强制这种平等,看起来有人在 XE6 中搞砸了它 我已为您提交了质控报告:#124667 Unresolved External error in UnicodeString destructor。 嗯,我就是这么想的!感谢 QC 日志 Remy。你还是那个!!我正在评估产品,我正在与 Embarcadero 的卖家和工程师保持联系。我会向他们推荐新的 QC。 【参考方案1】:

您是否碰巧在 XE6 上使用 32 位 XE3 和 64 位?如果是这样,64 位通常不支持多个调用约定,因此几乎所有内容都是 cdecl。这是正常的

【讨论】:

以上是关于XE6 Ansi/Unicode 字符串链接器错误(未解决的外部问题)的主要内容,如果未能解决你的问题,请参考以下文章

Windows 记事本的 ANSI,Unicode,UTF-8 这三种编码模式有啥区别

字符编解码的故事(ASCII,ANSI,Unicode,Utf-8区别)

delphi.指针.PChar

没有文件头的txt文件,如何判断是啥编码格式

iOS中的Delphi XE6链接C代码

Delphi XE6“错误读取表格”