构建针对mysql-connector-c / libmysqlclient / mysql C API的应用程序时的链接器警告

时间:2011-03-24 22:39:16

标签: mysql gcc linker mysql-connector linker-warning

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

/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

以下是一些相关的args / flags:

为了构建库,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

2 个答案:

答案 0 :(得分:5)

出现这些警告是因为有问题的GLibC函数在内部使用GLibC Name Service Switch (NSS)机制:

  

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

     
      
  1. 贡献者可以添加新服务,而无需将其添加到GNU C库。
  2.   
  3. 模块可以单独更新。
  4.   
  5. C库图像较小。
  6.         

    为了实现上述第一个目标,下面将描述模块的ABI。对于   获得新服务的实施是非常重要的,了解如何   调用模块中的函数。它们绝不是设计用于   程序员直接。相反,程序员应该只使用文档和   用于访问数据库的标准化功能。

由于NSS机制依赖于动态链接工作,因此无论您是静态链接还是动态链接,都需要在运行时使用相应的NSS模块(大多数都带有glibc)以便能够使用这些功能。 C库本身。这些警告提醒您在运行时确实需要这些模块;尝试在没有NSS模块的盒子上运行链接二进制文件将在运行时失败,并且ld.so抱怨它无法找到'libnss_files.so.2'或其他类似的东西。

答案 1 :(得分:0)

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