我有一個Delphi單元,它使用{$L xxx}
指令靜態鏈接一個C .obj文件。 C文件使用C++ Builder的命令行編譯器進行編譯。爲了滿足C文件的運行時庫依賴性(_assert,memmove等),我包括crtl
單元Allen Bauer提到的here。如何在C++ Builder項目中的Delphi單元中使用Crtl? (或鏈接到C++ Builder C運行時庫)
unit FooWrapper;
interface
implementation
uses
Crtl; // Part of the Delphi RTL
{$L FooLib.obj} // Compiled with "bcc32 -q -c foolib.c"
procedure Foo; cdecl; external;
end.
如果我在Delphi項目(.dproj)中編譯該單元,everthing可以正常工作。
如果我編譯單元在C++ Builder項目(.cbproj)失敗,出現錯誤:
[ILINK32 Error] Fatal: Unable to open file 'CRTL.OBJ'
事實上,沒有一個crtl.obj
文件中的RAD Studio的安裝文件夾。有一個.dcu,但沒有.pas。嘗試將crtdbg
添加到uses子句(定義了_assert的C頭)時出現錯誤,它找不到crtdbg.dcu
。
如果我刪除使用條款,它,而不是失敗,並__assert
和_memmove
都沒有發現錯誤。
因此,在C++ Builder項目中的Delphi單元中,如何從C運行時庫中導出函數以便它們可用於鏈接?
我已經知道Rudy Velthuis的article。如果可能的話,我想避免手動編寫Delphi包裝器,因爲我不需要它們在Delphi中,並且C++ Builder必須已經包含必要的功能。
編輯
的人誰願意在家裏自己玩,代碼是在https://tpabbrevia.svn.sourceforge.net/svnroot/tpabbrevia/trunk Abbrevia的Subversion倉庫中。我已經採取了David Heffernan的建議,並添加了一個「AbCrtl.pas」單元,它在C++ Builder中編譯時模仿crtl.dcu。這得到了PPMD支持工作,但LZMA和WavPack的庫都失敗,連接錯誤:
[ILINK32 Error] Error: Unresolved external '_beginthreadex' referenced from ABLZMA.OBJ
[ILINK32 Error] Error: Unresolved external 'sprintf' referenced from ABWAVPACK.OBJ
[ILINK32 Error] Error: Unresolved external 'strncmp' referenced from ABWAVPACK.OBJ
[ILINK32 Error] Error: Unresolved external '_ftol' referenced from ABWAVPACK.OBJ
AFAICT,所有的人都正確地宣佈,與_beginthreadex之一AbLzma.pas實際上宣告,所以它的使用通過純Delphi編譯。要自己查看它,只需下載trunk(或者僅僅是「source」和「packages」目錄),禁用AbDefine.inc底部的{$ IFDEF BCB}塊,然後嘗試編譯C++代碼, + Builder「Abbrevia.cbproj」項目。
我向TurboPower Abbrevia(Delphi zip/tar/gz庫)添加了Lzma支持。所有與Lzma(C)庫交互的代碼都是Delphi。我只是想讓Abbrevia也支持C++ Builder。 – 2011-03-14 20:02:09
我有點超出我的深度。 Delphi單元可以訪問C++ Builder項目中的.c/.h文件嗎?也就是說,如果我在直接訪問原始項目頭文件的.c文件中創建了一個重複的「LzmaDecompress()」函數,我將如何在Delphi單元中引用它? – 2011-03-14 20:04:41
將C代碼靜態鏈接到Delphi的唯一方法是使用$ L。 – 2011-03-14 20:11:41