10

我正在尝试从源代码(根据此处的说明)构建 mysql-connector-c 并静态链接到我的应用程序中的库。但是,我收到以下警告,我想知道是否有人对为什么会这样有任何想法:

/path/to/lib/libmysqlclient.a(mf_pack.c.o): In function `unpack_dirname':
mf_pack.c:(.text+0x90b): warning: Using 'getpwnam' in statically linked 
applications requires at runtime the shared libraries from the glibc version 
used for linking
/path/to/lib/libmysqlclient.a(libmysql.c.o): In function `read_user_name':
libmysql.c:(.text+0x2b06): warning: Using 'getpwuid' in statically linked 
applications requires at runtime the shared libraries from the glibc version 
used for linking
/path/to/lib/libmysqlclient.a(mf_pack.c.o): In function `unpack_dirname':
mf_pack.c:(.text+0x916): warning: Using 'endpwent' in statically linked 
applications requires at runtime the shared libraries from the glibc version 
used for linking
/path/to/lib/libmysqlclient.a(client.c.o): In function `mysql_real_connect':
client.c:(.text+0x305c): warning: Using 'getaddrinfo' in statically linked 
applications requires at runtime the shared libraries from the glibc version 
used for linking
/path/to/lib/libmysqlclient.a(libmysql.c.o): In function `mysql_server_init':
libmysql.c:(.text+0x2f9b): warning: Using 'getservbyname' in statically linked
applications requires at runtime the shared libraries from the glibc version 
used for linking

以下是一些相关的参数/标志:

为了构建库,CMake 正在传递以下内容:

-G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX=/path/to/my/install/root -DCMAKE_C_FLAGS="-m64" -DCMAKE_CXX_FLAGS="-m64"

用于构建应用程序:

CFLAGS := $(CFLAGS) -Werror -Wall -ggdb -gdwarf-2
LDFLAGS := $(LDFLAGS) -static -ggdb -gdwarf-2
4

2 回答 2

6

出现这些警告是因为有问题的 GLibC 函数在内部使用GLibC 名称服务切换 (NSS)机制:

基本思想是将提供的用于访问数据库的不同服务的实现放在单独的模块中。这有一些优点:

  1. 贡献者可以添加新服务,而无需将它们添加到 GNU C 库中。
  2. 模块可以单独更新。
  3. C 库映像更小。

为了实现上面的第一个目标,模块的 ABI 将在下面描述。为了正确实现新服务,了解模块中的函数是如何被调用的很重要。它们绝不是为程序员直接使用而设计的。相反,程序员应该只使用文档化和标准化的函数来访问数据库。

由于 NSS 机制依赖于动态链接才能工作,因此无论您是静态链接还是动态链接到 C 库,您都需要在运行时使用适当的 NSS 模块(其中大部分都与 glibc 一起提供)才能使用这些函数本身。警告用于提醒您在运行时确实需要这些模块;尝试在没有 NSS 模块的盒子上运行链接的二进制文件将在运行时失败,并出现来自 ld.so 的错误,抱怨它找不到“libnss_files.so.2”或其他类似的东西。

于 2014-11-05T20:22:51.270 回答
0

也许你应该静态链接 glibc: -static-libgcc

于 2011-03-24T22:46:41.903 回答