Linux编译链接之库
2014-12-02 15:57
141 查看
简要记录linux下编译静态库和动态库的方法,
创建静态库:ar -cvq libctest.a ctest.o ctest2.o
显示静态库中的文件列表(创建符号表):ar -t libctest.a
链接使用:
列出静态库中包含的目标文件
列出静态库中目标文件所包含的详细API,这个很有用哦
nm /usr/lib/libopencv_ts.a
Wall: 显示警告信息;
-fPIC: 即position independent code,编译时相对位置查找
-shared: 生成动态库的选项
-Wl,option: 传递参数,此处"-soname libctest.so.1",即命名;
-o: 目标名称
如果为了省事儿,可以采用下述命令生成.so
在调用动态库时,可以采取下述模式
查询执行文件的依赖库: ldd prog
ps:
ldconfig 命令的用途,主要是在默认搜寻目录(/lib和/usr/lib)以及动态库配置文件/etc/ld.so.conf内所列的目录下,搜索出可共享的动态链接库(格式如前介绍,lib*.so*),进而创建出动态装入程序(ld.so)所需的连接和缓存文件.缓存文件默认为 /etc/ld.so.cache,此文件保存已排好序的动态链接库名字列表.
此处lib_path为需求库所在的目录;当然也可以使用相对路径,以方便移动;此种方式有一个缺点,在关机之后library cache将会丢掉所加的内容。
总的说来,编译器会先在path文件夹下搜索libxxx.so文件,如果没有找到,继续搜索libxxx.a(静态库)。
【2】 静态库/动态库
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执行ldconfigps:
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_PATHexport 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】 静态库/动态库
相关文章推荐
- ARM Linux编译链接过程分析
- linux下boost编译及链接到系统目录
- 在linux下创建静态链接库和编译链接
- Linux下GCC 编译时如何指定链接库
- Linux编译链接环境变量
- Linux下编译出来的动态链接库缺少so后缀的问题解决
- Linux下GCC 编译时如何指定链接库
- linux C 语言入门 编译链接运行
- linux 里的eclips编译OpenGL链接不到相应库的问题
- 64位 linux 编译链接错库的问题
- ARM Linux编译链接过程分析
- 毕设-02.27 在linux下完成ffmepg+vlc的编译和链接 并成功导入eclipse编译运行
- 工具链 (编译程序,汇编程序,和链接程序和内核头文件)linux
- linux 下QT 程序编译链接两个错误
- Linux C++ Mysql 编译链接
- linux下boost编译及链接到系统目录
- 在linux中进行编译链接的一些选项
- linux编译同时链接静态和动态库
- Linux下编译动态链接库
- Linux下编译链接多个源文件