VC++静态库以及动态库编程以及使用

来源:互联网 发布:汽车cae软件 编辑:程序博客网 时间:2024/06/03 18:58

VC++程序开发中,我们经常要用到自己开发的或者第三方的静态库或者动态库。

1.静态库使用,我们可以使用自己编译的lib库或者第三方lib库,只要把lib文件和头文件放在当前工程,lib文件可以通过#pragma comment(lib,"DLLTest.lib")或者通过vs编辑器工程属性的方式加载,使用lib库时生成.exe文件时,不需要依赖其他文件,会把lib文件编译进exe文件,这样生成的.exe文件就会偏大。

2.动态dll的使用,这里主要讲自己编写的DLL使用,VC++中我们可以把一些大的独立的功能模块编译生产DLL,亦可以把这些DLL使用在其他的工程,这里我们以一个求和的函数为例子。

a)实现讲下静态加载dll的方法,新建一个工程,添加文件

//addNum.hextern "C" __declspec(dllexport) int addNum(int a,int b);//addNum.cpp#include "AddNum.h"int addNum(int a,int b){return a + b;}


项目属性设置编程生DLL文件

  


























然后新建一个工程使用这个dll,这里不要引入头文件,代码为:

#include <stdio.h>#include <Windows.h>//#include "AddNum.h"#include <string>#include <iostream>using namespace std;//#pragma comment(lib,"DLLTest.lib")//extern "C" __declspec(dllimport) int addNumInt(int x,int y); typedef int (*FUCADDNUM)(int a,int b);FUCADDNUM pAddNum = NULL;string addString(){string tmp;tmp += "Hello";return tmp;}int main(){HMODULE m_hModule = ::LoadLibrary("E:\\LearnWorkPlace\\DLLTest\\Debug\\DLLTest.dll");pAddNum = (FUCADDNUM)::GetProcAddress(m_hModule, "addNum");int tmp = pAddNum(1,2);//int tmp = addNumInt(2,5);cout<<addString()<<endl;//int tmp = addNum(2,6);printf("addNum: %d\n",tmp);return 0;}
这里需要定义函数指针。

b)运行时动态加载dll,代码为:

#include <stdio.h>#include <Windows.h>//#include "AddNum.h"#include <string>#include <iostream>using namespace std;#pragma comment(lib,"DLLTest.lib")extern "C" __declspec(dllimport) int addNum(int x,int y); //typedef int (*FUCADDNUM)(int a,int b);//FUCADDNUM pAddNum = NULL;string addString(){string tmp;tmp += "Hello";return tmp;}int main(){//HMODULE m_hModule = ::LoadLibrary("E:\\LearnWorkPlace\\DLLTest\\Debug\\DLLTest.dll");//pAddNum = (FUCADDNUM)::GetProcAddress(m_hModule, "addNum");//int tmp = pAddNum(1,2);//int tmp = addNumInt(2,5);cout<<addString()<<endl;int tmp = addNum(2,6);printf("addNum: %d\n",tmp);return 0;}

这里在不需要头文件时,我们需要自己申明extern "c" __declspec(dllimport) int addNum(int x,int y)才能使用,需要把dll放在EXE目录,不然运行不了,也需要主动连接lib。如果不主动声明,需要包含头文件,DLLMain函数没自己写的话,系统自动会默认生产DLLMain。



0 0
原创粉丝点击