如何链接.h文件中声明为extern的函数,以创建.dll文件



我想为我工作中使用的一个用C++编写的组件创建一个动态库(.dll)。有几个函数在.h文件中被声明为extern,并在相应的.cpp文件中被引用。当链接它们时,我得到了未解决的符号错误。

xxxx.obj:错误LNK2019:未解析的外部符号"int __cdecl run_xxx(int,char**const,struct st_xx*)"(?run_xxx@@YAHHQEAPEADPEAUst_xx@@@Z)在函数"int __cdecl start_xx(int,int,char**const)"中引用(?start_xx@@YAHHHHQEAPEAD@Z)

这些函数的用法类似于,它们需要由使用此库的任何应用程序定义。因此,这些函数的定义将仅在使用此库的应用程序中。因此,在链接时,我无法添加任何其他具有这些API定义的库。

创建dll时需要如何处理外部API?

DLL不能链接到应用程序中的函数,就好像DLL和应用程序是一个大型C++程序一样。

Windows DLL本身更像是一个可执行文件:它不像C或C++静态库。

最简单的方法是让应用程序在某些初始化调用中将指针传递给回调/自定义函数、DLL。更高级的是,您可以将接口传递到DLL。第三种选择是,函数由应用程序必须提供的自己的DLL提供。


基于可执行文件和DLL都使用可移植可执行文件格式这一事实,还有一种可能的脏的低级别方法,因此原则上,可执行文件可以导出函数供DLL使用,实际上既是可执行文件又是DLL。然而,这是很久以前我做过的事情,我不能保证它是可行的,无论如何,我建议不要这样做。

简单:

  1. 您必须编写一个仅在链接时使用的存根
  2. 在运行时,如果函数位于可执行文件中,则加载器(动态链接)将符号解析为它们

最新更新