【问题标题】:Linker warnings while building application against mysql-connector-c/libmysqlclient/mysql C API针对 mysql-connector-c/libmysqlclient/mysql C API 构建应用程序时的链接器警告
【发布时间】:2011-03-24 22:39:16
【问题描述】:

我正在尝试从源代码构建 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

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

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

【问题讨论】:

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


    【解决方案1】:

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

    基本思想是把提供的不同服务的实现放到访问 不同模块中的数据库。这有一些优点:

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

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

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

    【讨论】:

    • 我想这应该是答案,因为我也遇到了同样的问题,并且知道这是由于解释的原因而发生的。
    【解决方案2】:

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

    【讨论】:

    • 在指定了所有三个 -static -static-libgcc -static-libstdc++ 时仍会出现这些警告。
    • 这与回答 OP 的问题相去甚远。请参阅下面的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-20
    相关资源
    最近更新 更多