.cpp程序文件是源代码,对任何程序员是可见的,没有安全性可言,但是,在实际开发中,出于技术保密或其它方面考虑,开发者并不希望提供公用函数库的源代码。
C/C++提供了一个可以保证代码安全性的方法,把公共的程序文件编译成库文件,库文件时一种可执行代码的二进制形式,可以与其它的源程序一起编译,也可以被操作系统载入内存执行。
库文件分为静态库与动态库。
一、静态库
静态库在编译的时候,主程序文件与静态库一起编译,把主程序与主程序中用到的库函数一起整合进了目标文件。这样做优点是在编译后的可执行程序可以独立运行,因为所使用的函数都已经被编译进去了。缺点是,如果所使用的静态库发生更新改变,我们的程序必须重新编译。
静态库文件名的命名方式是“libxxx.a”,库名前加”lib”,后缀用”.a”,“xxx”为静态库名。
1.生成静态库的方法
先编译生成.o文件:g++ sort1.cpp sort2.cpp -c
然后用ar工具将.o文件打包生成静态库文件:ar -rc libsort.a sort1.o sort2.o
ar工具的参数选项比较重要的有
-c 创建
-r 插入
-t 列出已有成员
-d 删除
2.使用静态库的方法
1)直接把库文件写进去
2)用-L指定静态库目录,-l指定静态库名,此方法会为名字自动加上lib前缀和.a(.so)后缀.
例如 -lsort 等价于 libsort.a
二、动态库
动态库在编译时并不会被连接到目标代码中,而是在程序运行时才被载入,因此在程序运行时还需要指定动态库的目录。
动态库的命名方式与静态库类似,前缀相同,为“lib”,后缀变为“.so” “xxx”为动态库名。
生成动态库的方法
编译生成.o文件,注意要加上 -fPIC 选项 ,使代码位置无关:g++ sort1.cpp sort2.cpp -c -fPIC
,然后再用-shared将.o文件链接成库:g++ sort1.o sort2.o -shared -o libsort.so
也可直接从.cpp -fPIC -shared 生成库:g++ sort1.cpp sort2.cpp -fPIC -shared -o libsort.so
采用了动态链接库的可执行程序在运行时需要指定动态库文件的目录,Linux系统中采用LD_LIBRARY_PATH环境变量指定动态库文件的目录。
采用以下命令设置LD_LIBRARY_PATH环境变量。
export LD_LIBRARY_PATH=库文件路径
三、两种库的区别
1) 静态库把库文件链接到了可执行文件中,因此它不依赖于库文件,而动态库只是一个软链接,当库文件被删除时可执行文件会执行不了.
2) 当动态库中代码被修改时只需要重新编译库文件即可,而静态库需要全部重新编译.
3) 静态链接生成的可执行程序比动态链接生成的大很多,运行时占用的内存也更多。