我们都知道 *.a 代表静态库;*.so 代表动态库。那么这两个库到底怎么制作呢?
制作静态库的方法:
-
把代码编译为目标文件形式:
# gcc -c liberr.c -o liberr.o
-
使用工具ar创建一个存档文件:
# ar rcs liberr.a liberr.o
-
编译程序时把程序和liberr.a链接起来:
# gcc errtest.c -o errtest -static -L./ -lerr
制作动态库的方法:
-
首先编译目标文件:
# gcc -fPIC -g -c liberr.c -o liberr.o
-
然后链接库:
#gcc -g -shared -Wl,-soname,liberr.so -o liberr.so.1.0.0 liberr.o -lc
-
把生成的动态库liberr.so.1.0.0拷贝到/usr/lib目录里:
#cp liberr.so.1.0.0 /usr/lib
-
进入/usr/lib目录建立两个链接文件:
#cd /usr/lib
#ln -s liberr.so.1.0.0 liberr.so.1
#ln -s liberr.so.1.0.0 liberr.so
-
编译程序时和动态库链接起来:
#gcc errtest.c -o errtest -lerr
附加的常识:
编译时,标准的头文件在 /usr/include 下,系统编译时默认自动到这搜索。
若要自定义的头文件,用户可通过在命令中加 –I <库路径> 到额外指定的头文件搜索自己要包含的头文件。
而系统默认的链接库搜索路径在 /usr/lib , /lib 下,若要链接自己制定的库要在命令中加上 -l<库名> -L <库的路径>
其中:–l 指定要链接的具体库名
-L 到额外库搜索的路径
例:g++ hello.cpp –o hello –I /usr/lib/qt-3.1/include –lqt –L /usr/lib/qt-3.1/lib
解释:-lqt 代表链接 qt 库,其中qt 库在/usr/lib/qt-3.1/lib下的名是libqt.so
–L /usr/lib/qt-3.1/lib 代表路径在/usr/lib/qt-3.1/lib 下