注:本文参考 pdf 《VC++动态链接库(DLL)编程深入浅出》 写本文只是自己对看过的知识进行总结,如果需要可以去看参考的pdf,会更详细
概念:
静态链接库和动态连接库都是共享代码的方式。
如果采用静态库,那么代码会被包含在最终生成的EXE文件中;如果采用动态库,那么程序运行时可以动态的引用和卸载这个与EXE独立的DLL文件。
另一个区别是静态库不能再包含其他动态或者静态的库文件,而动态库可以包含除自己以外的静态或动态库
首先来写一个简单的静态库,然后调用它。我的环境是vs2010,win7下
第一步先创建一个空项目,项目名字叫testlib(名字随意)
第二步分别创建lib.h和lib.cpp
lib.h
#ifndef LIB_H
#define LIB_H
extern "C" int add(int x,int y);
#endif //LIB_H
extern "C" 意思是以C的方式编译,为的是用c编译的程序也能够调用你写的库。
lib.cpp
#include "lib.h"
int add(int x,int y)
{
return x+y;
}
修改后编译,你会在项目的debug文件夹中看到testlib.lib 这就是你写的库文件
第四步调用你写的库文件里的函数
为了方便起见,我们在同一个解决方案中创建一个libCall项目。
右键解决方案“testlib”(1个项目)->添加->新建项目
创建好后应该是这样子
创建main.cpp
#include <stdio.h>
#include "../testlib/lib.h"
#pragma comment(lib,"../Debug/testlib.lib")
int main(int argv, char* argc[])
{
printf("%d",add(2,3));
getchar();
return 0;
}
#pragma comment(lib,"../Debug/testlib.lib") 这句需要注意,"../Debug/testlib.lib"要根据.lib文件所在路径填写
#pragma comment( comment-type ,["commentstring"] )
comment-type是一个预定义的标识符,指定注释的类型,应该是compiler,exestr,lib,linker之一。
commentstring是一个提供为comment-type提供附加信息的字符串。
这个不需要深究,放置一个库搜索记录到对象文件中,让程序可以找到你的lib文件
结尾的getchar();是让用户输入一个字符,为了不让命令行一闪而过,方便看结果而添加的
对于刚开始接触程序的人,对路径总是怕写不对,“./”标识当前路径 “../”标识向上一级 路径的设置需要自己打开工程文件确认相对路径
好了,这个例子就写到这里,运行,应该可以正常显示