当前位置: 技术问答>linux和unix
Linux下Shared Object编译问题
来源: 互联网 发布时间:2016-03-12
本文导语: 小弟在编译一个Linux下的so文件的时候碰到如下问题: 编译 A.so时, 引用了 libB.a 这个静态库, 然后在使用A.so时发现还要有B.so(静态库libB.a对应的so)这个文件才行 有没有办法让编译出来的A.so不需要B.so也能正常使用 ...
小弟在编译一个Linux下的so文件的时候碰到如下问题:
编译 A.so时, 引用了 libB.a 这个静态库, 然后在使用A.so时发现还要有B.so(静态库libB.a对应的so)这个文件才行
有没有办法让编译出来的A.so不需要B.so也能正常使用
编译 A.so时, 引用了 libB.a 这个静态库, 然后在使用A.so时发现还要有B.so(静态库libB.a对应的so)这个文件才行
有没有办法让编译出来的A.so不需要B.so也能正常使用
|
/*
* main.c
*/
#include
void foo(void);
int
main(void)
{
(void)printf("%s: %sn", __FILE__, __FUNCTION__);
foo();
return (0);
}
/*
* foo.c
*/
#include
void bar(void);
void
foo(void)
{
(void)printf("%s: %sn", __FILE__, __FUNCTION__);
bar();
}
/*
* bar.c
*/
#include
void
bar(void)
{
(void)printf("%s: %sn", __FILE__, __FUNCTION__);
}
#! /bin/sh -x
#
# build.sh
#
cc -c -fPIC -DPIC bar.c
cc -shared -o libbar.so bar.o
ar cr libbar.a bar.o
ranlib libbar.a
cc -c -fPIC -DPIC foo.c
cc -shared -o libfoo.so foo.o -Wl,-rpath=./ -L./ -lbar
cc -shared -o libfoostatic.so foo.o -Wl,-rpath=./ libbar.a
cc -c main.c
cc -o foobar -Wl,-rpath=./ main.o -L./ -lfoo
cc -o foobarstatic -Wl,-rpath=./ main.o -L./ -lfoostatic
ldd foobar foobarstatic
uname -msvrp
[code=BatchFile]
$ ./build.sh
+ cc -c -fPIC -DPIC bar.c
+ cc -shared -o libbar.so bar.o
+ ar cr libbar.a bar.o
+ ranlib libbar.a
+ cc -c -fPIC -DPIC foo.c
+ cc -shared -o libfoo.so foo.o -Wl,-rpath=./ -L./ -lbar
+ cc -shared -o libfoostatic.so foo.o -Wl,-rpath=./ libbar.a
+ cc -c main.c
+ cc -o foobar -Wl,-rpath=./ main.o -L./ -lfoo
+ cc -o foobarstatic -Wl,-rpath=./ main.o -L./ -lfoostatic
+ ldd foobar foobarstatic
foobar:
libfoo.so => ./libfoo.so (0x00002ab43bade000)
libc.so.6 => /lib64/libc.so.6 (0x00000039aec00000)
libbar.so => ./libbar.so (0x00002ab43bcfa000)
/lib64/ld-linux-x86-64.so.2 (0x00000039ae800000)
foobarstatic:
libfoostatic.so => ./libfoostatic.so (0x00002ac2c5b9b000)
libc.so.6 => /lib64/libc.so.6 (0x00000039aec00000)
/lib64/ld-linux-x86-64.so.2 (0x00000039ae800000)
+ uname -msvrp
Linux 2.6.20 #1 SMP Thu Feb 14 18:08:17 CST 2008 x86_64 x86_64
[/code]
|
这里涉及到程序的编译,连接,装载运行..
你的应该是哪个环节出现错误..
我不知道你的A.so编译连接成功了没有..
如果成功了, $ldd A.so看看它依赖哪些库.
"有没有办法让编译出来的A.so不需要B.so也能正常使用" 通过静态连接可以的
你的应该是哪个环节出现错误..
我不知道你的A.so编译连接成功了没有..
如果成功了, $ldd A.so看看它依赖哪些库.
"有没有办法让编译出来的A.so不需要B.so也能正常使用" 通过静态连接可以的