【问题标题】:Building a shared library created a static library instead构建共享库改为创建静态库
【发布时间】:2017-06-08 07:26:40
【问题描述】:

我正在尝试在 MinGW-w64 下将 libass 构建为具有静态链接的共享库。当我配置时

./configure --disable-static --enable-shared

它按预期生成共享库(动态链接)。但是,当我尝试通过设置强制静态链接时

LDFLAGS=-static

它不是生成一个静态链接的共享库(.dll 没有依赖项),而是生成一个静态库 (.a)。

我几乎可以肯定我拥有所有依赖的静态库,并且在制作过程中没有显示错误或警告消息。

谁能解释一下我做错了什么?

【问题讨论】:

    标签: gcc shared-libraries mingw static-linking


    【解决方案1】:

    libtool 说不。

    包的 stock autotools ltmain.sh 脚本解析链接标志和 如果它找到-static 它不会建立一个共享库,只是一个静态的 一个。

    这是它可以合理做的最多的事情,因为您不能静态链接共享 图书馆。共享库必须完全由位置无关 (PIC) 代码或链接将失败,而静态链接将调用链接 由非 PIC 标准和运行时库提供的非 PIC 目标文件, 如果没有别的。

    foo.c

    #include <stdio.h>
    
    void foo(void)
    {
        puts("foo");
    }
    

    构建动态链接的共享库:

    $ gcc -c -fPIC foo.c
    $ gcc -shared -o libfoo.so foo.o
    $ file libfoo.so
    libfoo.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), \
    dynamically linked, BuildID[sha1]=1adff7204d84d138a80bc4b6f3f38211e4b42812, \
    not stripped
    

    尝试构建静态链接共享库:

    $ gcc -c -fPIC foo.c
    $ gcc -shared -static -o libfoo.so foo.o
    /usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/6/crtbeginT.o: \
    relocation R_X86_64_32 against hidden symbol `__TMC_END__' cannot be used \
    when making a shared object
    /usr/bin/ld: final link failed: Nonrepresentable section on output
    collect2: error: ld returned 1 exit status
    

    【讨论】:

    • 我将此标记为正确答案,因为问题的根源确实是 libtool 使用 -static 选项而不是传递它。我找到的解决方案是将-Wc,-static 传递给LDFLAGS,以便libtool 在链接模式下将-static 传递给gcc,以强制静态链接依赖项。
    【解决方案2】:

    静态库只是一个 ar 包。 您可以使用 ar 命令进行打包和解包。

    【讨论】:

    • 感谢您的回答!我的问题是我希望输出是一个共享库(.DLL),但我得到的是一个静态库(.a)。
    猜你喜欢
    • 2017-12-27
    • 1970-01-01
    • 1970-01-01
    • 2013-03-28
    • 1970-01-01
    • 2021-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多