这取决于您所使用的任何C编译器使用的名称修饰方式。例如,32位 bcc32 编译器会将 Test
修饰为 _Test
。因此,与之链接的 Delphi 代码应该是:
function Test(): Integer; cdecl; external name '_Test';
但是装饰在编译器之间是不同的,您没有说明您使用的是哪个编译器。如果上面的代码没有帮助,那么您应该使用C编译器的工具来转储obj文件并检查其中的函数名称。
另一个问题是您实际上正在使用C++编译器而不是C编译器。这可以从您使用的方式中看出
extern "C"
这段代码不是有效的C代码。你应该删除它并切换到一个C编译器。将扩展名从.cpp改为.c通常就足以让编译器将代码视为C代码。
如果你开始调用C标准库中的函数,比如malloc
和其它函数,那么你需要在Delphi代码的使用子句中添加System.Win.Crtl
单元。
还要注意的是,在你的C代码中,不需要也不应该实现一个main
函数。如果你想将C函数编译成一个单独的C程序,那么把这些函数放在单独的源文件中,与包含主函数的源文件分开。这样你就可以将源文件编译成对象,并将它们链接到C程序或者你的Delphi代码中。但你不需要在你的Delphi程序中携带一个没有调用的main
函数。
在C语言中,一个无参的main
函数的正确签名是:
int main(void)
同样地,你的另一个C函数应该有这个签名:
int __cdecl Test(void)
当然,
__cdecl
是默认值,所以我们完全可以省略它:
int Test(void)
让我们把所有内容都整合起来:
C
int Test(void)
{
return 12;
}
很重要的一点是您需要使用C编译器进行编译,而不是作为C++进行编译。如果您现在编辑中声明的编译器是MSVC,则命令行应为:
cl /c source.c
Delphi
(暂未提供需要翻译的内容)
{$APPTYPE CONSOLE}
{$L Source.obj}
function Test: Integer; cdecl; external name '_Test';
begin
WriteLn(Test);
end.
输出
12