Предупреждения компоновщика при создании приложения для API-интерфейса mysql-connector-c/libmysqlclient/mysql C

Я пытаюсь построить 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

Ответ 1

Эти предупреждения возникают из-за того, что в функциях GLibC используется механизм GLibC Name Service Switch (NSS):

Основная идея заключается в том, чтобы внедрить различные сервисы, предлагаемые для доступа базы данных в отдельных модулях. Это имеет некоторые преимущества:

  • Участники могут добавлять новые службы, не добавляя их в библиотеку GNU C.
  • Модули могут обновляться отдельно.
  • Изображение библиотеки C меньше.

Для выполнения первой цели выше ABI модулей будет описано ниже. Для получение прав на новую услугу важно понять, как функции в модулях вызываются. Они никоим образом не предназначены для использования программист напрямую. Вместо этого программист должен использовать только документированные и стандартизованные функции для доступа к базам данных.

Поскольку механизм NSS использует динамическую привязку к работе, вам нужны соответствующие модули NSS (большинство из которых поставляются с glibc) во время выполнения, чтобы иметь возможность использовать эти функции, независимо от того, статически или динамически связаны с самой библиотеки C. Предупреждения предупреждают вас, что вам действительно понадобятся эти модули во время выполнения; попытка запустить связанный двоичный код на ящике без модулей NSS на нем не удастся во время выполнения с ошибкой ld.so, жалующейся на то, что она не может найти "libnss_files.so.2" или еще что-нибудь из этого файла.

Ответ 2

Возможно, вам следует статически связать с glibc: -static-libgcc.