Предупреждения компоновщика при сборке приложения против API mysql-connector-c / libmysqlclient / mysql C - PullRequest
10 голосов
/ 25 марта 2011

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

Ответы [ 2 ]

5 голосов
/ 05 ноября 2014

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

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

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

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

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

0 голосов
/ 25 марта 2011

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

...