gpt4 book ai didi

delphi - 如何正确地将C与Delphi静态链接?

转载 作者:行者123 更新时间:2023-12-03 15:09:02 26 4
gpt4 key购买 nike

如何正确地将 C 与 Delphi 静态链接? Delphi 吐出一个错误:

[dcc32 错误] Project1.dpr(15): E2065 不满足转发或外部声明:“测试”

C 编译器是带有 COFF 目标文件的 Visual C++。

德尔福:

program Project1;

{$L C:\Source.obj}

function Test(): Integer; cdecl; external;

begin
WriteLn(Test);
end.

C:

extern "C" int __cdecl Test()
{
return 12;
}

int main()
{
return 0;
}

最佳答案

这取决于您所使用的 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 等,那么您将需要将 System.Win.Crtl 单元添加到您的 Delphi代码的uses子句。

另请注意,您不需要(实际上可能也不应该)在 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

关于delphi - 如何正确地将C与Delphi静态链接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33261956/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com