您的位置:首页 > 运维架构 > Linux

Linux编译链接之库

2014-12-02 15:57 141 查看
简要记录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


列出静态库中包含的目标文件



列出静态库中目标文件所包含的详细API,这个很有用哦
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


Wall: 显示警告信息;
-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.参考

【1】 ldconfig和ldd的用法
【2】 静态库/动态库
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: