静态库的编译 共享库的编译链接运行 及共享库的区别(2)
2013-05-21 09:41
246 查看
1、组成共享库的目标文件和一般的目标文件有所不同,在编译时要加
[/code]
2、把
3、解决方法
最常用的方法。把
include /etc/ld.so.conf.d/*.conf
/home/langu/linuxk/link/libshared
然后运行
4、指定noname编译(逗号之间不能用空格)
按照共享库的命名惯例,每个共享库有三个文件名:real name、soname和linker name。真正的库文件(而不是符号链接)的名字是real name,包含完整的共享库版本号。
编译生成的库文件是
$ gcc -shared -Wl,-soname,libstack.so.1 -o libstack.so.1.0 stack.o push.o pop.o is_empty.o
把
langu@langu:~/linuxk/link/libshared$ ls -l libs*
lrwxrwxrwx 1 langu langu 15 May 21 11:18 libstack.so -> libstack.so.1.0
lrwxrwxrwx 1 root root 15 May 21 11:20 libstack.so.1 -> libstack.so.1.1
-rwxrwxr-x 1 langu langu 7937 May 21 11:17 libstack.so.1.0
-rwxrwxr-x 1 langu langu 7937 May 21 11:19 libstack.so.1.1
lrwxrwxrwx 1 root root 15 May 21 11:21 libstack.so.2 -> libstack.so.2.0
-rwxrwxr-x 1 langu langu 7937 May 21 11:20 libstack.so.2.0
soname是一个符号链接的名字,只包含共享库的主版本号,主版本号一致即可保证库函数的接口一致,因此应用程序的
-fPIC选项,
$ gcc -c -fPIC stack/stack.c stack/push.c stack/pop.c stack/is_empty.c [code]-f后面跟一些编译选项,
PIC是其中一种,表示生成位置无关代码(Position Independent Code)
[/code]
gcc -shared -o libstack.so stack.o push.o pop.o is_empty.o
2、把
main.c和共享库编译链接在一起,然后运行:
$ gcc main.c -g -L. -lstack -Istack -o main $ ./main ./main: error while loading shared libraries: libstack.so: cannot open shared object file: No such file or directory
3、解决方法
最常用的方法。把
libstack.so所在目录的绝对路径(比如/home/langu/linuxk/link/libshared)添加到
/etc/ld.so.conf中(该文件中每个路径占一行),如:
include /etc/ld.so.conf.d/*.conf
/home/langu/linuxk/link/libshared
然后运行
ldconfig
4、指定noname编译(逗号之间不能用空格)
按照共享库的命名惯例,每个共享库有三个文件名:real name、soname和linker name。真正的库文件(而不是符号链接)的名字是real name,包含完整的共享库版本号。
编译生成的库文件是
libstack.so.1.0,是real name,但这个库文件中记录了它的soname是
libstack.so.1:
$ gcc -shared -Wl,-soname,libstack.so.1 -o libstack.so.1.0 stack.o push.o pop.o is_empty.o
把
libstack.so.1.0所在的目录加入
/etc/ld.so.conf中,然后运行
ldconfig命令,
ldconfig会自动创建一个soname的符号链接:
$ sudo ldconfig
$ ln -s libstack.so.1.0 libstack.so $ gcc main.c -L. -lstack -Istack -o main
langu@langu:~/linuxk/link/libshared$ ls -l libs*
lrwxrwxrwx 1 langu langu 15 May 21 11:18 libstack.so -> libstack.so.1.0
lrwxrwxrwx 1 root root 15 May 21 11:20 libstack.so.1 -> libstack.so.1.1
-rwxrwxr-x 1 langu langu 7937 May 21 11:17 libstack.so.1.0
-rwxrwxr-x 1 langu langu 7937 May 21 11:19 libstack.so.1.1
lrwxrwxrwx 1 root root 15 May 21 11:21 libstack.so.2 -> libstack.so.2.0
-rwxrwxr-x 1 langu langu 7937 May 21 11:20 libstack.so.2.0
soname是一个符号链接的名字,只包含共享库的主版本号,主版本号一致即可保证库函数的接口一致,因此应用程序的
.dynamic段只记录共享库的soname,只要soname一致,这个共享库就可以用。假如有libstack.so.1和
libstack.so.2是两个主版本号不同的libstack.so,有些应用程序依赖于libstack.
so.1,有些应用程序依赖于
libstack.so.2,但对于依赖
libstack
.so.1的应用程序来说,真正的库文件不管是
libstack.so.1.0是
libcap.so.1.1都可以用,所以使用共享库可以很方便地升级库文件而不需要重新编译应用程序,这是静态库所没有的优点。
相关文章推荐
- 静态库的编译 共享库的编译链接运行 及共享库的区别(1)
- 运行过程中链接动态链接库与编译过程中链接动态库的区别
- 运行过程中链接动态链接库与编译过程中链接动态库的区别
- 编译时连接与运行时链接及静态库链接
- 编译时连接与运行时链接及静态库链接
- 静态库和共享库库的定位搜索路径(编译时和运行时)
- linux下c++编程环境搭建,运行过程以及调试,内含C++头文件源文件编译过程链接
- 静态编译动态编译;静态链接动态链接;静态库和动态库
- 静态库和共享库库的定位搜索路径(编译时和运行时)
- 编译和链接的区别
- 【基础知识】linux c 编译链接运行、动态链接库
- 静态库/动态库的 生成与编译链接
- linux中静态库和动态库的区别和编译
- 编译和链接的区别
- 编译和链接的区别、makefile怎么写
- c/c++编译时,指定程序运行时查找的动态链接库路径
- 编译和链接的区别
- 编译和链接的区别
- 编译和链接的区别
- 编译有哪些阶段,动态链接和静态链接的区别 c++