Gcc 如何链接动态lib(.so)和静态libc.a

Gcc 如何链接动态lib(.so)和静态libc.a,gcc,linker,shared-libraries,static-libraries,Gcc,Linker,Shared Libraries,Static Libraries,我试图链接静态libc.a和动态lib,但没有成功 我已经尝试过以下几点: 首先,我测试所有动态: gcc-sharedlibtest.c-o libtest.so gcc-c main.c-o main.o gcc main.o-o测试-L.-ltest 它正在工作(编译和执行) 其次,我测试我想要的(动态lib和静态libc): gcc-sharedlibtest.c-o libtest.so gcc-c main.c-o main.o gcc main.o-o test libtes

我试图链接静态libc.a和动态lib,但没有成功

我已经尝试过以下几点:

  • 首先,我测试所有动态:

    • gcc-sharedlibtest.c-o libtest.so
    • gcc-c main.c-o main.o
    • gcc main.o-o测试-L.-ltest
    它正在工作(编译和执行)

  • 其次,我测试我想要的(动态lib和静态libc):

    • gcc-sharedlibtest.c-o libtest.so
    • gcc-c main.c-o main.o
    • gcc main.o-o test libtest.so/usr/lib/libc.a
    它正在编译,但在执行时,它是错误的! 一个strace显示它正在尝试访问libc。所以

  • 最后,我尝试编译一个简单的程序,不引用动态库

    • gcc-static main.c-->编译正常,运行正常
    • gcc main.c/usr/lib/libc.a-->编译正常,运行:分段错误(显示它可以访问libc.so)
  • 怎么做

    谢谢

    您的第二个测试(您想做的测试)在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
    

    实现所需功能的一种方法是使用:
    -static libgcc-Wl,-Bstatic-lc

    什么操作系统?如果你为你感兴趣的操作系统添加一个标签,更多的人会看到这个问题。gcc的版本是什么?
    $ ldd ./libtest.so 
        linux-gate.so.1 =>  (0xb80c7000)
        libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb7f4f000)
        /lib/ld-linux.so.2 (0xb80c8000)