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

时间:2015-12-09 09:21:19

标签: c++ windows dll extern

我想为我的工作中使用的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,int,char * * const)"中引用。 (?start_xx @@ @ YAHHHHQEAPEAD Z)

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

创建dll时如何处理extern API?

2 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分:0)

简单:

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