gpt4 book ai didi

gcc - 如何链接动态库 (.so) 和静态 libc.a

转载 作者:行者123 更新时间:2023-12-04 15:05:10 24 4
gpt4 key购买 nike

我正在尝试与静态 libc.a 和动态 lib .so 链接,但未成功。

我已经尝试了以下内容:

  • 首先我用所有动态测试:
  • gcc -shared libtest.c -o libtest.so
  • gcc -c main.c -o main.o
  • gcc main.o -o test -L. -ltest

  • 它正在工作(编译和执行)
  • 其次,我测试我想要的(动态库和静态库):
  • 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

  • 它正在编译,但在执行时,它出现了段错误!
    strace 显示它正在尝试访问 libc.so !!!
  • 最后,我尝试编译一个不引用动态库的简单程序
  • gcc -static main.c --> 编译正常,运行正常
  • gcc main.c/usr/lib/libc.a --> 编译好,运行:segmentation fault(strace 显示它可以访问 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

    但是,您必须意识到您构建的共享库依赖于共享 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 .

    关于gcc - 如何链接动态库 (.so) 和静态 libc.a,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2176181/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com