gcc - 构建共享库改为创建静态库

标签 gcc shared-libraries mingw static-linking

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

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

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

LDFLAGS=-static

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

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

任何人都可以阐明我做错了什么吗?

最佳答案

libtool 说不。

包的库存自动工具 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

关于gcc - 构建共享库改为创建静态库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44429253/

相关文章:

c++ - 可以编辑 GCC 头文件吗?

c++ - 静态库和共享库的区别?

c++ - mingw32 上的 libtar.h

用mingw编译FMOD?

c++ - 无法在动态链接库 libstdc++-6.dll 中找到过程入口点 _gxx_personality_v0

c++ - mingw32-make 使用 g++ 而不是 cc 或 gcc 来编译 .c 源文件

c - i386-elf-gcc 输出关于 "static a = 0"的奇怪汇编命令

c - 在 Windows 中使用 GCC 或 Clang 强制 LP64 数据模型

c++ - 在共享库中初始化全局数据的最佳方法是什么?

c - 如何安全地将一组 C 函数实现为自初始化库?