标签: 静态链接库 lib 动态链接库 dll 区别 it | 分类:编程技术 |
今天闲着没事做,自己写了一点小笔记,不知道对于新手有没用,高手就不用看了,作为新手的我斗胆来发表一个笔记,就是静态库文件的封装过程,使用VC++6.0编写,下面是正文,也许我的用语并不专业 以前我们写C/C++源文件的时候,都是先将各个写好的源文件编译,编译生成的是目标文件机器码,即.obj文件.(目标文件的扩展名不一定是.obj文件). 我们调用的标准C/C++函数机器码实际被封装于标准C/C++静态库文件中的.即那些扩展名为.lib的文件中. 最后链接器将我们编译的各个目标文件里的机器码和静态库(标准C/C++库)中的函数机器码链接到一起形成一个扩展名为.exe满天星草药图片的可执行文件模块. 在这里我们叙述将C/C++源文件编译链接成一个静态库文件,但它不是可执行模块,它体内含有可执行机器码 静态库文件就像一个仓库或者容器,里面封装了一些可执行机器码.这些机器码是我们用程序设计语言,比如C/C++源文件编译后生成的机器码. 一.下面将讨论将C/C++源文件编译并链接成一个静态库文件的过程, 在VC++6.0中选择File-New-Win32 Static Library,写好工程名创建好工作空间后再选择菜单中New-File来为工程添加C或者C++ 源文件. 假如我们为该工程添加了一个名为lib_c.c和一个名为lib_cpp.cpp的源文件 //lib_c.c中的内容 合同示范文本extern int Add(int x,int y) //该函数是一个外部函数,任何文件都可以访问它 { return x+y; } extern int data_c //这是一个外部全局变量,任何文件可以访问它 //lib_cpp.cpp中的内容 extern “C” int reduce(int x,int y)//这里加了个”C”表示允许C源文件访问这个C++函数代码 { 爸的笔顺是return x-y; } extern “C” int data_cpp=2; 注意以下几点 (1)当“extern”关键字修饰在函数或全局变量的定义中时,表示该函数或全局变量任何文件可以访问,“extern”关键字可以省略不写,缺省下就是”extern” 当“extern”关键字修饰在函数声明或全局变量声明中时,表示限定当前文件只能引用用“extern”关键字修饰定义的函数或全局变量. (2)当”static”关键字修饰在函数或全局变量的定义中时,表示该函数或全局变量只能由本文件中加了”static”关键字修饰的函数声明或全局变量声明来引用. 当”static”关键字修饰在函数声明或全局变量声明中时,表示限定当前文件只能引用用“static”关键字修饰定义的函数或全局变量. (3)在CPP源文件的函数和全局变量定义中加了个”C”表示允许C源文件访问该函数和全局变量.如果是C++源文件访它们的话则可加可不加.注意这”C”要大写. 接下来就要将写好的C/C++源文件进行编译和链接,最后会生成一个扩展名为.lib的文件.该文件就是静态库文件了,该静态库文件是不能直接运行的,我们所编译的C/C++源文件的机器码就已经被封装进这个用VC++6.0创建的静态库文件里面去了. 二.如何将编写好的静态库文件像使用C/C++标准库那样使用,下面将继续讨论 1.用VC++6.0新建一个工程名为TEST,添加一个名为TEST.c的源文件到该工程,因为我们将测试一下,将我们编写的库文件里的函数或者全局变量的机器码链接到我们这个TEST.c源文件中去,假设我们生成的库文件名为TEST.lib,先拷贝如下范例代码到TEST.c中 //TEST.c #include <stdio.h> extern int Add(int x,int y); //当前文件只能访问“extern”关键字修饰定义的Add函数 extern int reduce(int x,int y);// //当前文件只能访问“extern”关键字修饰定义的reduce函数 #pragma comment(lib,"TEST.lib") //指示链接器到字符串所表示的文件路径中去找库文件 int main() 大学生旅游{ printf("%d\n",Add(2,3)); printf("%d\n",reduce(3,2)); return 0; } 这里我们要声明静态库中已知的函数或全局变量的声明 #pragma comment(lib,"TEST.lib")这条指令告诉链接器到字符串所表示的路径下去找库文件,这里我将库文件放到了当前工程目录下.也可以不写这句. 还有一种方法,可以直接在VC++6.0电脑配置单中设置依次选择tools、options、directories、library files菜单或选项,填入库文件路径(只键入库文件所在目录路径而不能输入库文件名),这只是告诉链接器库文件所在目录的路径,还没告诉链接器库文件名,方法是VC++6.0中设置依次选择project-ttings-link 在object/library modules: 这栏输入库文件名字然后就OK了 2.当用C++源文件的目标文件和库文件的代码链接时有一点小改变,这里就不浪费口舌了,假设我们新建了一个工程并添加了一个名为TEST.CPP的源文件,拷贝如下范例代码到TEST.CPP中 //TEST.cpp #include <stdio.h> extern “C” int Add(int x,int y); //表示引用的是C函数代码 extern int reduce(int x,int y); #pragma comment(lib,"TEST.lib") int main() { printf("%d\n",Add(2,3)); printf("%d\n",reduce(3,2)); return 0; 魂牵梦萦的意思是什么} 在这个C++源文件里引用C函数代码同样要加个”C”,但是在C源文件引用C++函数代码不能加”C++”,编译会报错,只能在C++文件函数定义中加”C”. 只有C++才支持这种引用方式,也许因为只有C++兼容C而没有C兼容C++这一原则. |
本文发布于:2023-05-31 08:57:35,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/fan/82/819251.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |