Rom*_*aum 5 delphi linker initialization c++builder virtualtreeview
我正在为Delphi和C++ Builder维护VirtualTreeView组件.使用Delphi一切都很好但是当我使用C++ Builder编译软件包时,Delphi单元初始化部分中的代码不会被调用.有任何想法吗?
当在C++ Builder项目中没有调用Delphi单元的initialization
/ finalization
sections时,通常意味着Delphi单元没有被链接到最终的可执行文件中,这通常是因为C++代码没有直接引用单元中的任何代码,所以它得到优化.C++ Builder在删除未使用的代码方面比Delphi更具攻击性.在Delphi中,只需在uses
子句中添加单元即可强制将该单元链接到.在C++中并非如此. 如果C++代码不使用文件中的任何内容,那么用C++代码编写#include
Delphi单元的.hpp
文件是不足以保证单元链接的.hpp
.
印地遇到了这个问题,它的几个单位,最值得注意的是IdAllAuthentications
,IdAllFTPListParsers
和IdAllHeaderCoders
.这些单元都只包含初始化/终结代码,没有接口代码,因此它们生成的.hpp
文件基本上是空的.为了强制链接,我不得不在{$HPPEMIT}
语句中添加语句以在生成的文件中interface
输出#pragma link
语句.hpp
.例如:
unit IdAllAuthentications;
interface
{
Note that this unit is simply for listing ALL Authentications in Indy.
The user could then add this unit to a uses clause in their program and
have all Authentications linked into their program.
ABSOLUTELY NO CODE is permitted in this unit.
}
{$I IdCompilerDefines.inc}
// RLebeau 2/14/09: this forces C++Builder to link to this unit so
// the units can register themselves correctly at program startup...
{$IFDEF HAS_DIRECTIVE_HPPEMIT_LINKUNIT}
{$HPPEMIT LINKUNIT}
{$ELSE}
{$HPPEMIT '#pragma link "IdAllAuthentications"'}
{$ENDIF}
implementation
// uses units that self-register in their initialization sections ...
end.
Run Code Online (Sandbox Code Playgroud)
{$HPPEMIT LINKUNIT}
在XE5 Update 2中引入,以帮助链接使用单位范围名称的单位:
新增内容:您现在可以使用HPPEMIT Delphi编译器指令来链接和生成C++名称空间声明.
...
{$ HPPEMIT LINKUNIT}替换iOS设备目标平台的#pragma链接.有关更多信息,请参阅HPPEMIT.
对于C++应用程序,
{$HPPEMIT LINKUNIT}
替换#pragma link
在移动平台上.Delphi运行时具有必须链接的单元才能启用某些功能.在C++中,以前使用以下指令实现了自动链接:
{$HPPEMIT '#pragma link "<unitname>"'}
现在您应该使用以下指令:
{$HPPEMIT LINKUNIT}
LINKUNIT
生成一个#pragma link
语句,使用正确的装饰/命名空间单元名称引用调用单元.