2010-02-01 25 views
6

我想链接静态libc.a和动态库.so失败。如何链接动态lib(.so)和静态libc.a

我已经tryied如下:

  1. 首先,我所有的动态测试:

    • 的gcc -shared libtest.c -o libtest.so
    • GCC -c主.c -o main.o
    • gcc main.o -o test -L。 -ltest

    它的工作(编译和执行)

  2. 其次我测试我想要什么(动态lib和静态的libc):

    • 的gcc -shared libtest.c -o libtest。所以
    • GCC -c的main.c -o main.o
    • GCC main.o -o测试libtest.so /usr/lib/libc.a

    这是编译,但在执行时,它segfault! strace显示它正试图访问libc.so !!!

  3. 最后我试图编译一个简单的编程'没有提到动态LIB

    • GCC -static的main.c - >编译OK,OK运行
    • 的gcc main.c中的/ usr /lib/libc.a - >编译正常,运行:分段故障(第strace的显示,它的访问的libc.so)

如何做到这一点?

谢谢

+1

什么操作系统?如果您为您感兴趣的操作系统添加标签,更多人会看到这个问题。 – caf 2010-02-01 11:40:35

+0

gcc的版本是什么? – BHS 2014-11-07 17:00:00

回答

6

你的第二个测试(你想要做的那个)为我工作在i686-linux的:

$ cat libtest.c 
#include <stdio.h> 
void foo() { printf("%d\n", 42); } 
$ cat main.c 
#include <stdio.h> 
extern void foo(); 
int main() { puts("The answer is:"); foo(); } 
$ export LD_LIBRARY_PATH=$PWD                        
$ gcc -shared libtest.c -o libtest.so && gcc -c main.c -o main.o && gcc main.o -o test -L. -ltest && ./test   
The answer is: 
42 
$ gcc -shared libtest.c -o libtest.so && gcc -c main.c -o main.o && gcc main.o -o test libtest.so /usr/lib/libc.a && ./test 
The answer is: 
42 

但是,你必须认识到,共享库,你已经编译取决于共享的libc。所以,它试图在运行时打开它是很自然的。

$ ldd ./libtest.so 
    linux-gate.so.1 => (0xb80c7000) 
    libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb7f4f000) 
    /lib/ld-linux.so.2 (0xb80c8000) 

达到目的的一种方法是使用:-static-libgcc -Wl,-Bstatic -lc