日期:2014-05-16  浏览次数:20624 次

Linux 下的静态库和动态库 -- 例程

head.h



#include<iostream>
void fun1();
void fun2();
void fun3();




fun1.cpp



#include "head.h"

void fun1()
{
	std::cout<<"fun1"<<std::endl;
} 




fun2.cpp



#include "head.h"

void fun2()
{
	std::cout<<"fun2"<<std::endl;
} 




fun3.cpp



#include "head.h"

void fun3()
{
	std::cout<<"fun3"<<std::endl;
} 




main.cpp



#include "head.h"

int main()
{
	fun1();
	fun2();
	fun3();
} 



将fun1.cpp,fun2.cpp,fun3.cpp生成目标文件


g++ –c fun1.c fun2.c fun3.c


用ar命令生成一个libmyfun.a的静态库文件,并把fun1.o,fun2.o,fun3.o内容插入到对应的库文件中


ar r libmyfun.a  fun1.o  fun2.o  fun3.o


静态连接方式生成可执行文件


g++ -o  myfuntest main.cpp  -L . -lmyfun



运行可执行文件


./myfuntest


即可看见运行结果




利用以上代码和文件创建动态库


g++ -fpic -shared -o libmyfun.so fun1.o fun2.o fun3.o

其中:

-fpic 使输出的对象模块是按照可重定位地址方式生成的。
-shared指定把对应的源文件生成对应的动态链接库文件libmyfun.so文件。


利用动态库生成可执行文件


g++ -o somyfuntest main.cpp -L . -lmyfun


与静态库的利用不同的是,在默认情况下,当程序运行时,系统会搜索/lib和/usr./lib,如果连接库没有存在这两个目录下,系统将不能找到链接库,程序会终止运行。所以,一般情况下我们需要手动的添加路径或者更改LD_LIBRARY_PATH的环境变量。

前者,我们需要把当前生成的动态库的路径加到/usr/local/lib下面。我一般情况下习惯于用后一种方法,我习惯于这样做,export  LD_LIBRARY_PATH=$PWD然后我们就可以执行可执行文件somyfuntest了。