dll文件生成
vc编译器与gcc的编译原理是一样的,个别的函数像printf可能编译结果不大一样。程序生成的基本过程就是编译,链接。编译大体上也分三部分,预处理,编译,汇编,因为编译过程最复杂,所以这三步一般合起来叫编译。以前的有讨论过http://blog.csdn.net/ysu108/article/details/7529273。每个.cpp文件在windows都会生成一个obj目标文件,头文件不参与编译(在vc下头文件右击是灰色的),只有在链接的时候与库一起生成可执行文件。
动态链接在Linux下是.o文件,在windows就是dll文件,原理和作用是一样的,使用动态链接库的优点上面的文章也说过,msdn上也有提到http://msdn.microsoft.com/zh-cn/library/dtba4t8b(v=vs.80).aspx。一些常用的dll库一般放在C:\WINDOWS\system32下,如果想注册一个dll可以拷贝一份,然后regsvr32命令注册一份。注册时候要注意dll所在目录是不可以有中文的,如果dll错误,那么有两种情况,版本不对和dll文件缺失。
使用ace库时候链接出现问题,dll文件和头文件都有了,链接的时候LNK2001:unresolved external symbol错误,查了下感觉自己不清楚dll文件的生成原理,自己操作下如何生成dll文件。
微软的Visual C++支持三种DLL,它们分别是Non-MFC Dll(非MFC动态库)、Regular Dll(常规DLL)、Extension Dll(扩展DLL)。Non-MFC DLL指的是不用MFC的类库结构,直接用C语言写的DLL,其导出的函数是标准的C接口,能被非MFC或MFC编写的应用程序所调用。Regular DLL和的Extension Dlls一样,是用MFC类库编写的。
我们已经知道DLL是包含若干个函数的库文件,应用程序使用DLL中的函数之前,应该先导出这些函数,以便供给应用程序使用。要导出这些函数有两种方法,一是在定义函数时使用导出关键字_declspec(dllexport),另外一种方法是在创建DLL文件时使用模块定义文件.Def。需要读者注意的是在使用第一种方法的时候,不能使用DEF文件。下面通过两个例子来说明如何使用这两种方法创建DLL文件。
1)使用导出函数关键字_declspec(dllexport)创建MyDll.dll,该动态链接库中有两个函数,分别用来实现得到两个数的最大和最小数。在MyDll.h和MyDLL.cpp文件中分别输入如下原代码:
//MyDLL.h
extern "C" _declspec(dllexport) int Max(int a, int b);
extern "C" _declspec(dllexport) int Min(int a, int b);
//MyDll.cpp
#include
#include"MyDll.h"
int Max(int a, int b)
{
if(a>=b)return a;
else
return b;
}
int Min(int a, int b)
{
if(a>=b)ret