建立共享库的几个步骤:
$gcc -c -fpic file_1.c
生成file_1.o
$gcc -shared -o libfile_1.so file_1.o
生成一个动态库libfile_1.so,命名方式为libXX.so
$gcc -LX -o output file_2.c -lfile_1
此时生成了一个执行程序:file_2
-L和路径之间有无空格都可以,习惯都使用没有空格的。如果生成的libXX.so不在系统默认的库文件内,是不会连接成功的。
运行时会出现问题,因为程序在运行时会查找默认的共享库目录,发现没有就会报错
去设置路径。或者把库复制到/usr/lib/中,一般不这么做
$export LD_LIBRARY_PATH=X
最后就可以执行了
注:本文的X,为路径。XX为名称
静态库
一样,只是用归档工具制作一个静态库
实例:
fred.c
#include
void show()
{
printf("fred.c is me\n");
}
fred
fred.h
#ifndef FRED_H_
#define FRED_H_
void show();
#endif
main.c
#include
#include "fred.h"
void main(void)
{
show();
printf("this is main.c\n");
}
——————————————动态库——————————————————
$gcc -c -fpic fred.c
生成fred.o
$gcc -shared -o libfred.so fred.o
生成libfred.so
$gcc -L./ -o test main.c -lfred
生成主程序
$export LD_LIBRARY_PATH=./
./test
输出
fred.c is me
this is main.c
——————————————静态库————————————————————
$gcc -c fred.c
生成fred.o
$ar -crv libfred.a fred.o
生成静态库libfred.a
$ranlib libfred.a
函数库内容表
$gcc -o test main.c libfred.a 或者 $gcc -o test main.c -L./ -lfred
生成test
运行
./test
输出和上面一样
————————————————————————————————————————
总结:
静态库是把代码加到程序中,动态库是运行时才会加载需要的函数。所以静态库最后运行时不需要设置函数库路径
在boost编译是.hpp 采用的组织是把源代码写到.hpp。所以不属于动态连接库