当前位置: 技术问答>linux和unix
还是关于linux共享库版本化的问题,有重谢
来源: 互联网 发布时间:2017-03-05
本文导语: 自己找的一个例子代码如下: foo.c void foo_v1(int f) { printf("foo_v1n"); } __asm__(".symver foo_v1,foo@@VERSION_1.0"); main.c #include void foo(int); int main(void) { foo(100); return 0; } 1.ver VERSION_1.0{ global: ...
自己找的一个例子代码如下:
在编译时我有些不懂不过现在是正确的,我想按照下面说的进行修改
1.soname应该加大版本号为libfoo.so.1
2.ln软连接按照网上资料应该是ln -sf soname linkname(即ln -sf libfoo.so.1 libfoo.so)
如果按照上述修改,在编译连链接时报错为
求大神指点一下怎么修改?小弟重谢!
foo.c
void foo_v1(int f) {
printf("foo_v1n");
}
__asm__(".symver foo_v1,foo@@VERSION_1.0");
main.c
#include
void foo(int);
int main(void) {
foo(100);
return 0;
}
1.ver
VERSION_1.0{
global:
foo;
};
Makefile
all: v1
libfoo.so.1.0 : foo.c
gcc -shared -fPIC -o libfoo.so.1.0 -Wl,--soname='libfoo.so' -Wl,--version-script=1.ver foo.c
v1: main.c libfoo.so.1.0.0
ln -sf libfoo.so.1.0 libfoo.so
gcc -Wall -o v1 -lfoo -L. main.c
.PHONY:clean
clean:
rm -f libfoo* v1
在编译时我有些不懂不过现在是正确的,我想按照下面说的进行修改
1.soname应该加大版本号为libfoo.so.1
2.ln软连接按照网上资料应该是ln -sf soname linkname(即ln -sf libfoo.so.1 libfoo.so)
如果按照上述修改,在编译连链接时报错为
/usr/bin/ld: cannot find -lfoo
collect2: ld returned 1 exit status
make: *** [v1] Error 1
求大神指点一下怎么修改?小弟重谢!
|
libfoo.so.1.0 : foo.c
gcc -shared -fPIC -o libfoo.so.1.0 -Wl,--soname='libfoo.so' -Wl,--version-script=1.ver foo.c
v1: main.c libfoo.so.1.0.0
ln -sf libfoo.so.1.0 libfoo.so
gcc -Wall -o v1 -lfoo -L. main.c
红色部分怎么解释?
另外ln -sf libfoo.so.1.0 libfoo.so这句换成自动生成的,因为你编译的时候指定名字了。
ldconfig -n .
你现在的linkname和soname是同一个名字,不过没关系。
gcc -shared -fPIC -o libfoo.so.1.0 -Wl,--soname='libfoo.so' -Wl,--version-script=1.ver foo.c
v1: main.c libfoo.so.1.0.0
ln -sf libfoo.so.1.0 libfoo.so
gcc -Wall -o v1 -lfoo -L. main.c
红色部分怎么解释?
另外ln -sf libfoo.so.1.0 libfoo.so这句换成自动生成的,因为你编译的时候指定名字了。
ldconfig -n .
你现在的linkname和soname是同一个名字,不过没关系。
|
(1)如果是第一次,把-lfoo去了吧!这句话是说要链接foo这个库,但foo不就是你现在正在编译的么!所以你在第一次链接时还没有foo,必须把他去了
(2)如果你已经有了libfoo.so.0,把他放在当前路径或usr/lib/下吧!不然会找不到
(2)如果你已经有了libfoo.so.0,把他放在当前路径或usr/lib/下吧!不然会找不到
|
Makefile里加上LFLAGS += -L你的库的路径。