c怎么生成dll文件?
2个回答
2013-04-24
展开全部
用 vc 6.0 下的cl.exe 和 link.exe工具,请读下文:
声明:下面这篇文章不是我写的,源自:一个叫,有容乃大 的博客
如何手工编写动态链接库(windows dll)
1.本例介绍在命令行(Console)环境下制作dll的方法
2.读者动手前,请确保在windows中安装有编译、链接工具和必要的函数库文件。
3.本例使用C语言实现.
4.本例中使用路径均为我机器上的绝对路径,读者需根据实际情况调整。
工具要求:
Microsoft的编译器cl.exe
MIcrosoft链接器link.exe
dll制作步骤:
1.编写dll函数实现源代码hello.c
#include
int say_hello(char* name)
{
printf( "hello %s\n ", name);
return 1;
}
2.编写dll函数输出定义文件hello.def.
LIBRARY hello
EXPORTS
say_hello @1
3.编译dll源码,生成dll,lib文件.
3.1 新建命令行窗口
3.2 设置PATH �0�7 INCLUDE �0�7 LIB 3个环境变量.
SET PATH=K:\vcnet\vc7\bin;%PATH%
SET INCLUDE=K:\vcnet\vc7\include;%INCLUDE%
SET LIB=K:\vsnet\Vc7\lib;%LIB%
3.3 编译hello.c
cd K:\Source\dllsample (hello.c和hello.def所在目录)
cl /c hello.c
3.4 链接hello.obj,生成hello.dll,hello.lib两个文件.
link /def:hello.def /dll hello.obj
4.测试dll函数.
4.1 编写测试代码 test.c
extern int say_hello(char* name);
int main(int argc,char** argv)
{
say_hello( "robbie ");
return 0;
}
4.2 编译测试代码test.c
cl /c test.c
4.3 链接test.obj和 hello.lib,生成可执行文件test.exe
link test.obj hello.lib
4.4 运行test.exe,屏幕输出:
hello robbie
至此,一个dll构造完毕.
下面是我自己的一点补充:
如果要在c++下,或者win32 mfc下使用标准c写的dll,必须把上面的声明
extern int say_hello(char* name);改成:extern "C " int say_hello(char* name);
声明:下面这篇文章不是我写的,源自:一个叫,有容乃大 的博客
如何手工编写动态链接库(windows dll)
1.本例介绍在命令行(Console)环境下制作dll的方法
2.读者动手前,请确保在windows中安装有编译、链接工具和必要的函数库文件。
3.本例使用C语言实现.
4.本例中使用路径均为我机器上的绝对路径,读者需根据实际情况调整。
工具要求:
Microsoft的编译器cl.exe
MIcrosoft链接器link.exe
dll制作步骤:
1.编写dll函数实现源代码hello.c
#include
int say_hello(char* name)
{
printf( "hello %s\n ", name);
return 1;
}
2.编写dll函数输出定义文件hello.def.
LIBRARY hello
EXPORTS
say_hello @1
3.编译dll源码,生成dll,lib文件.
3.1 新建命令行窗口
3.2 设置PATH �0�7 INCLUDE �0�7 LIB 3个环境变量.
SET PATH=K:\vcnet\vc7\bin;%PATH%
SET INCLUDE=K:\vcnet\vc7\include;%INCLUDE%
SET LIB=K:\vsnet\Vc7\lib;%LIB%
3.3 编译hello.c
cd K:\Source\dllsample (hello.c和hello.def所在目录)
cl /c hello.c
3.4 链接hello.obj,生成hello.dll,hello.lib两个文件.
link /def:hello.def /dll hello.obj
4.测试dll函数.
4.1 编写测试代码 test.c
extern int say_hello(char* name);
int main(int argc,char** argv)
{
say_hello( "robbie ");
return 0;
}
4.2 编译测试代码test.c
cl /c test.c
4.3 链接test.obj和 hello.lib,生成可执行文件test.exe
link test.obj hello.lib
4.4 运行test.exe,屏幕输出:
hello robbie
至此,一个dll构造完毕.
下面是我自己的一点补充:
如果要在c++下,或者win32 mfc下使用标准c写的dll,必须把上面的声明
extern int say_hello(char* name);改成:extern "C " int say_hello(char* name);
2018-08-04 · 知道合伙人软件行家
关注
展开全部
在VC++中选择新建一个Win32 Dynamic-Link Library。需要建立一个c/c++ head file和一个c/c++ source file并加入工程。头文件中内容为输出函数的声明,源文件中内容为DllMain函数和输出函数的定义。下面是一个最简单的例子。
//dlldemo.h
#ifdef __cplusplus
#define EXPORT extern "C" __declspec(dllexport)
#else
#define EXPORT __declspec(dllexport)
#endif
EXPORT void CALLBACK DllFoo(void) ;
//dlldemo.c
#include <windows.h>
#include "dlldemo.h"
int WINAPI DllMain (HINSTANCE hInstance, DWORD fdwReason, PVOID pvReserved)
{
return TRUE ;
}
EXPORT void CALLBACK DllFoo(void)
{
MessageBox(NULL,TEXT("This function is exported from a DLL"),TEXT("DllFoo"),MB_OK) ;
return ;
}
头文件预处理中的__declspec是微软增加的“C扩展类存储属性”(C Extended Storage-Class Attributes),它指明一个给出的实例被存储为一种微软特定的类存储属性,可以为thread,naked,dllimport或dllexport. [MSDN原文:The extended attribute syntax for specifying storage-class information uses the __declspec keyword, which specifies that an instance of a given type is to be stored with a Microsoft-specific storage-class attribute (thread, naked, dllimport, or dllexport).] 输出函数必须指明为CALLBACK。 DllMain是dll的入口点函数。也可以不写它。DllMain必须返回TRUE,否则系统将终止程序并弹出一个“启动程序时出错”对话框。 编译链接后,得到动态链接库文件dlldemo.dll和输入库文件dlldemo.lib。
//dlldemo.h
#ifdef __cplusplus
#define EXPORT extern "C" __declspec(dllexport)
#else
#define EXPORT __declspec(dllexport)
#endif
EXPORT void CALLBACK DllFoo(void) ;
//dlldemo.c
#include <windows.h>
#include "dlldemo.h"
int WINAPI DllMain (HINSTANCE hInstance, DWORD fdwReason, PVOID pvReserved)
{
return TRUE ;
}
EXPORT void CALLBACK DllFoo(void)
{
MessageBox(NULL,TEXT("This function is exported from a DLL"),TEXT("DllFoo"),MB_OK) ;
return ;
}
头文件预处理中的__declspec是微软增加的“C扩展类存储属性”(C Extended Storage-Class Attributes),它指明一个给出的实例被存储为一种微软特定的类存储属性,可以为thread,naked,dllimport或dllexport. [MSDN原文:The extended attribute syntax for specifying storage-class information uses the __declspec keyword, which specifies that an instance of a given type is to be stored with a Microsoft-specific storage-class attribute (thread, naked, dllimport, or dllexport).] 输出函数必须指明为CALLBACK。 DllMain是dll的入口点函数。也可以不写它。DllMain必须返回TRUE,否则系统将终止程序并弹出一个“启动程序时出错”对话框。 编译链接后,得到动态链接库文件dlldemo.dll和输入库文件dlldemo.lib。
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询