How to use Crtl in a Delphi unit in a C++Builder project? (or link to C++Builder C runtime library)
Posted
by
Craig Peterson
on Stack Overflow
See other posts from Stack Overflow
or by Craig Peterson
Published on 2011-03-14T19:41:57Z
Indexed on
2011/03/15
0:10 UTC
Read the original article
Hit count: 294
I have a Delphi unit that is statically linking a C .obj file using the {$L xxx}
directive. The C file is compiled with C++Builder's command line compiler. To satisfy the C file's runtime library dependencies (_assert, memmove, etc), I'm including the crtl
unit Allen Bauer mentioned here.
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.
If I compile that unit in a Delphi project (.dproj) everthing works correctly.
If I compile that unit in a C++Builder project (.cbproj) it fails with the error:
[ILINK32 Error] Fatal: Unable to open file 'CRTL.OBJ'
And indeed, there isn't a crtl.obj
file in the RAD Studio install folder. There is a .dcu, but no .pas. Trying to add crtdbg
to the uses clause (the C header where _assert is defined) gives an error that it can't find crtdbg.dcu
.
If I remove the uses clause, it instead fails with errors that __assert
and _memmove
aren't found.
So, in a Delphi unit in a C++Builder project, how can I export functions from the C runtime library so they're available for linking?
I'm already aware of Rudy Velthuis's article. I'd like to avoid manually writing Delphi wrappers if possible, since I don't need them in Delphi, and C++Builder must already include the necessary functions.
Edit
For anyone who wants to play along at home, the code is available in Abbrevia's Subversion repository at https://tpabbrevia.svn.sourceforge.net/svnroot/tpabbrevia/trunk. I've taken David Heffernan's advice and added a "AbCrtl.pas" unit that mimics crtl.dcu when compiled in C++Builder. That got the PPMd support working, but the Lzma and WavPack libraries both fail with link errors:
[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, all of them are declared correctly, and the _beginthreadex one is actually declared in AbLzma.pas, so it's used by the pure Delphi compile as well.
To see it yourself, just download the trunk (or just the "source" and "packages" directories), disable the {$IFDEF BCB} block at the bottom of AbDefine.inc, and try to compile the C++Builder "Abbrevia.cbproj" project.
© Stack Overflow or respective owner