Fenying

Angus’ Home.


30 Jan 2014

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

该文章迁移自作者的旧博客站点。
源地址:http://fenying.blog.163.com/blog/static/1020559932014030113854151/

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

以 lib 函数 myfunc1 为例:

int __stdcall myfunc1(); 

在 dllTest.h 内应该声明:

#ifdef _USRDLL
#	pragma comment(lib, "libMyFunc.lib") /* Sources static library */
#else
#	pragma comment(lib, "dllTest.lib") /* Lib for dll. */
#endif


#ifdef __cplusplus /* myfunc1 is written in Assembly. */
extern "C"
#endif
int __stdcall myfunc1();

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

LIBRARY dllTest
EXPORTS
myfunc1

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

下面写个程序测试下。

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

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


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

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

comments powered by Disqus