Delphi链接器和C++链接器之间的区别

opc*_*0de 4 c++ delphi static-linking

我来自Delphi世界,静态导入DLL函数非常简单.您需要做的就是指定函数名称和模块,如下所示:

function GetTickCount : DWORD; stdcall; external 'Kernel32.dll';
Run Code Online (Sandbox Code Playgroud)

为什么在C++中必须使用kernel32.lib才能导入函数?为什么我不能简单地告诉链接器像Delphi一样导入该函数?

我知道这对你们的manny来说听起来很无聊,但是从Delphi进入C++世界真的会让人感到困惑.

Gre*_*ill 8

C++工具链需要几个步骤来完成Delphi可以一步完成的工作.在C++中声明外部DLL函数时,没有(标准)方法来指示实际可以找到函数的命名DLL.就编译器而言,声明的函数很简单,extern并且必须有一个可以定义的定义在链接器的某处找到.

要将命名函数连接到可以找到它的DLL,C++工具链需要一个"导入库",其中包含链接器知道如何处理的导入存根.当查找由导入存根定义的函数时,链接器会为相应DLL中的特定函数名创建DLL函数引用(如导入存根所示).

在Delphi中,语言设计者允许程序员直接在源代码中指定相关的DLL.然后,Delphi编译器可以直接生成对外部DLL的引用,而无需使用导入存根步骤.