如何 link .h 文件中声明为 extern 的函数来创建 .dll 文件?
How to link a function declared as extern in .h file, to create a .dll file?
我想为我的工作中使用的一个用 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 时需要如何处理外部 API?
DLL 无法 link 在应用程序中运行,就好像 DLL 和应用程序是一个大型 C++ 程序一样。
Windows DLL 本身更像是一个可执行文件:它不像 C 或 C++ 静态库。
最简单的方法是让应用程序在某些初始化调用中将指向 callback/customization 函数的指针传递给 DLL。更高级别,您可以将接口传递给 DLL。第三种选择是这些函数由应用程序必须提供的它们自己的 DLL 提供。
基于可执行文件和 DLL 都使用可移植可执行格式这一事实,还有一种可能的肮脏低级方法,因此原则上可执行文件可以导出函数供 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,int,char * * const)" 中引用 ( ?start_xx@@YAHHHHQEAPEAD@Z)
这些函数的用法就像,它们需要被任何使用这个库的应用程序定义。所以这些函数的定义只会在使用这个库的应用程序中。 因此我无法在链接时添加任何其他具有这些 API 定义的库。
创建 dll 时需要如何处理外部 API?
DLL 无法 link 在应用程序中运行,就好像 DLL 和应用程序是一个大型 C++ 程序一样。
Windows DLL 本身更像是一个可执行文件:它不像 C 或 C++ 静态库。
最简单的方法是让应用程序在某些初始化调用中将指向 callback/customization 函数的指针传递给 DLL。更高级别,您可以将接口传递给 DLL。第三种选择是这些函数由应用程序必须提供的它们自己的 DLL 提供。
基于可执行文件和 DLL 都使用可移植可执行格式这一事实,还有一种可能的肮脏低级方法,因此原则上可执行文件可以导出函数供 DLL 使用,实际上既可执行又可执行动态链接库。然而,我在那个水平上做了很久以前的事情,我不能保证它是可行的,无论如何我建议不要这样做。
简单:
- 您必须编写一个仅在链接时使用的存根
- 在 运行 时,如果函数位于可执行文件中,则加载程序(动态链接)将符号解析为它们