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了。