Предупреждения компоновщика при создании приложения для 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
.