将无源代码的 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