2010-02-01 49 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