35

我已经包含了 header netdb.h,其中getaddrinfo包含,但 gcc 发出此警告:

warning: Using 'getaddrinfo' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking

gcc -m32 -static -s -O2 -std=c99 -D_POSIX_C_SOURCE=200112L myprogram.c

如何静态编译缺少的文件?

可能的解决方案:

  1. 可能是 glibc 安装缺少静态编译所需的相应目标文件。如果是这种情况,请创建相应的目标文件并在编译时链接它。

  2. 尝试使用 EGLIBC 而不是 glibc。

  3. 我成功地使用dietlibc 编译了我的程序,该程序编译时没有任何错误,而且生成的二进制文件比glibc 生成的要小得多。

4

3 回答 3

25

glibc 使用 libnss 来支持许多不同的地址解析服务提供程序。不幸的是,您不能静态链接 libnss,因为它加载的提供程序具体取决于本地系统的配置。

于 2010-06-21T17:48:51.713 回答
7

我找到了一个解决方案:你可以使用 musl 库来替换 glibc。要使用 musl,您可以安装它并使用 musl-gcc 构建您的软件,或者您可以使用使用 musl 的 Linux 发行版,例如 Alpine Linux。

就我而言,为了节省时间,我选择了 Alpine Linux 来构建我的程序(https://github.com/zhanxw/rvtests),因为我不想构建多个编译器(gcc、g++ 和 gfortran)。

于 2016-05-16T01:56:33.827 回答
2

我认为某些功能依赖于动态加载器在运行时解决问题。不幸的是,静态链接不再实用http://people.redhat.com/drepper/no_static_linking.html

于 2010-04-27T21:40:04.237 回答