简要记录linux下编译静态库和动态库的方法,
1.静态库(*.a)
编译:cc -Wall -c ctest1.c ctest2.c
创建静态库:ar -cvq libctest.a ctest.o ctest2.o
显示静态库中的文件列表(创建符号表):ar -t libctest.a
链接使用:
cc -o executable_name prog.c libctest.a
cc -o executable_name prog.c -L/path/tolibrary_directory -lctest
列出静态库中包含的目标文件
nm /usr/lib/libopencv_ts.a
2.动态库(*.so)
下述命令模块,建立共享动态库libctest.so.1.0,同时进行符号链接;
gcc -Wall -fPIC -c *.c
gcc -shared -Wl,-soname,libctest.so.1 -o libctest.so.1.0 *.o
mv libctest.so.1.0 /opt/lib
ln -sf /opt/lib/libctest.so.1.0 /opt/lib/libctest.so.1
ln -sf /opt/lib/libctest.so.1.0 /opt/lib/libctest.so
-fPIC: 即position independent code,编译时相对位置查找
-shared: 生成动态库的选项
-Wl,option: 传递参数,此处"-soname libctest.so.1",即命名;
-o: 目标名称
如果为了省事儿,可以采用下述命令生成.so
gcc *.c -fPIC -shared -o libctest.so.1
在调用动态库时,可以采取下述模式
gcc -Wall -I/path/to/include_files -L/path/to/libraries prog.c -lctest -o prog
//like this
gcc -Wall -L/ot/lib prog.c -lctest -o prog
查询执行文件的依赖库: ldd prog
2.1 配置动态库路径 Libary Path
为了可执行文件在运行时能够找到动态库,需要配置路径(下述方法至少采取一个)
2.1.1.修改/etc/ld.so.conf执行ldconfig
在/etc/ld.so.conf文件下加入动态库所在的目录,然后以root执行ldconfig
ps:
ldconfig 命令的用途,主要是在默认搜寻目录(/lib和/usr/lib)以及动态库配置文件/etc/ld.so.conf内所列的目录下,搜索出可共享的动态链接库(格式如前介绍,lib*.so*),进而创建出动态装入程序(ld.so)所需的连接和缓存文件.缓存文件默认为 /etc/ld.so.cache,此文件保存已排好序的动态链接库名字列表.
2. 向library cache内增加特殊路径的缓存(as root)
ldconfig -n /lib_path
此处lib_path为需求库所在的目录;当然也可以使用相对路径,以方便移动;此种方式有一个缺点,在关机之后library cache将会丢掉所加的内容。
3.修改环境变量LD_LIBRARY_PATH
不同版本的linux/unix中表示库文件路径的变量名称不统一,此处以linux/solaris为例,另外mac os x: DYLD_LIBRARY_PATH
export LD_LIBRARY_PATH=/opt/lib:$LD_LIBRARY_PAT
或者在~/.bashrc末尾加入:
...
if [ -d /opt/lib ];
then
LD_LIBRARY_PATH=/opt/lib:$LD_LIBRARY_PATH
fi
...
export LD_LIBRARY_PATH
总的说来,编译器会先在path文件夹下搜索libxxx.so文件,如果没有找到,继续搜索libxxx.a(静态库)。
3.参考