将无源代码的 lib 内函数添加到 dll 输出函数

该文章根据 CC-BY-4.0 协议发表,转载请遵循该协议。
本文地址:https://fenying.net/post/2014/01/30/expose-method-in-dll-from-static-library/

今天想把一个用汇编写的 lib 整合到一个 dll 的输出函数中,用 _declspec(dllexport) 导出该函数不可行,最后用 def 模块导出文件,终于在 Visual Studio 2012 下成功通过测试。

以 lib 函数 myfunc1 为例:

1int __stdcall myfunc1(); 

在 dllTest.h 内应该声明:

 1#ifdef _USRDLL
 2#	pragma comment(lib, "libMyFunc.lib") /* Sources static library */
 3#else
 4#	pragma comment(lib, "dllTest.lib") /* Lib for dll. */
 5#endif
 6
 7
 8#ifdef __cplusplus /* myfunc1 is written in Assembly. */
 9extern "C"
10#endif
11int __stdcall myfunc1();

然后使用 dllTest.def 模块定义文件,写如下内容:(Visual Studio 2012下,把“项目属性\连接器\输入\模块定义文件”修改为"dllTest.def")

1LIBRARY dllTest
2EXPORTS
3myfunc1

编译,即可生成 dllTest.dll 和 dllTest.lib。

下面写个程序测试下。

新建项目 testDll,然后把 dllTest.h, dllTest.dll, dllTest.lib 都复制到新项目的目录下。

main 函数里调用 myfunc1,测试 OK!


由此,可以知道用 def 模块定义文件可以导出 _declspec(dllexport) 所不能导出函数(主要是从其它库导入的函数),而_declspec(dllexport) 适合导出项目内的 C++ 函数和 C++ 类。

comments powered by Disqus