3.2 Создание приложений-клиентов API на C
В этом разделе приведены рекомендации по компиляции программ на C, использующих MySQL C API.
Компиляция MySQL-клиентов на Unix
В этих примерах используется компилятор gcc. На некоторых системах может быть уместен другой компилятор (например, clang на macOS или FreeBSD, или Sun Studio на Solaris). При необходимости скорректируйте примеры.
Возможно, при компиляции приложений-клиентов, использующих заголовочные файлы MySQL, потребуется указать опцию -I, чтобы компилятор мог их найти. Например, если заголовочные файлы установлены в /usr/local/mysql/include, используйте эту опцию в команде компиляции:
-I/usr/local/mysql/include
Вы можете связать свой код с динамической или статической библиотекой MySQL C-клиента. Базовое имя динамической библиотеки — libmysqlclient, а суффикс отличается в зависимости от платформы (например, .so для Linux, .dylib для macOS). Статическая библиотека называется libmysqlclient.a на всех платформах.
MySQL-клиенты должны быть связаны с помощью опции -lmysqlclient в команде связывания. Также может потребоваться опция -L, чтобы указать местоположение библиотеки. Например, если библиотека установлена в /usr/local/mysql/lib, используйте эти опции в команде связывания:
-L/usr/local/mysql/lib -lmysqlclient
Имена путей могут отличаться на вашей системе. При необходимости скорректируйте опции -I и -L.
Для упрощения компиляции MySQL-программ на Unix используйте скрипт mysql_config. Смотрите .
mysql_config отображает опции, необходимые для компиляции или связывания:
mysql_config --cflags
mysql_config --libs
Вы можете вызвать эти команды в командной строке, чтобы получить соответствующие опции и вручную добавить их в команды компиляции или связывания. Или же включите вывод из mysql_config непосредственно в команды с помощью обратных кавычек:
gcc -c `mysql_config --cflags` progname.c
gcc -o progname progname.o `mysql_config --libs`
На Unix связывание по умолчанию использует динамические библиотеки. Чтобы вместо этого связать со статической библиотекой клиента, добавьте её имя пути в команду связывания. Например, если библиотека расположена в /usr/local/mysql/lib, свяжите так:
gcc -o progname progname.o /usr/local/mysql/lib/libmysqlclient.a
Или используйте mysql_config для указания пути к библиотеке:
gcc -o progname progname.o `mysql_config --variable=pkglibdir`/libmysqlclient.a
mysql_config в настоящее время не предоставляет способа перечисления всех библиотек, необходимых для статического связывания, поэтому может потребоваться указать дополнительные библиотеки в команде связывания (например, -lnsl -lsocket на Solaris). Чтобы понять, какие библиотеки следует добавить, используйте mysql_config --libs и ldd libmysqlclient.so (или otool -L libmysqlclient.dylib на macOS).
pkg-config может быть использован как альтернатива mysql_config для получения информации, такой как флаги компилятора или библиотеки для связывания, необходимые для компиляции MySQL-приложений. Например, следующие пары команд эквивалентны:
mysql_config --cflags
pkg-config --cflags mysqlclient
mysql_config --libs
pkg-config --libs mysqlclient
Для создания флагов для статического связывания используйте эту команду:
pkg-config --static --libs mysqlclient
Для получения дополнительной информации обратитесь к Разделу 3.3, «Создание приложений-клиентов API на C с использованием pkg-config».
Компиляция MySQL-клиентов на Microsoft Windows
Для указания местоположений файлов заголовков и библиотек используйте средства, предоставляемые вашей средой разработки.
Для создания C API-клиентов на Windows необходимо связать C-клиентскую библиотеку, а также библиотеки сокетов Windows ws2_32 и библиотеку безопасности Secur32.
Вы можете связать свой код с динамической или статической MySQL C-клиентской библиотекой:
Динамическая библиотека называется
libmysql.dll. Кроме того, для использования динамической библиотеки требуется статическая библиотека импортаlibmysql.lib.Статическая библиотека называется
mysqlclient.lib. Для связывания со статической C-клиентской библиотекой приложение-клиент должно быть скомпилировано с той же версией Visual Studio, что и C-клиентская библиотека (которая для статической C-клиентской библиотеки, созданной Oracle, является Visual Studio 2013).
При использовании созданной Oracle MySQL C-клиентской библиотеки следуйте этим правилам при связывании C-времени выполнения вашего приложения-клиента:
-
Для MySQL C-клиентской библиотеки из сообщества MySQL:
Для MySQL 5.7.18 и выше: Всегда связывайте динамически с C-времени выполнения (используйте опцию компилятора
/MD), независимо от того, связываетесь ли вы со статической или динамической C-клиентской библиотекой. Кроме того, на хостах, на которых выполняется приложение-клиент, должна быть установлена перераспределяемая библиотека Visual C++ для Visual Studio 2013.-
Для MySQL 5.7.17 и ниже:
Если вы связываетесь со статической C-клиентской библиотекой, связывайтесь статически с C-времени выполнения (используйте опцию компилятора
/MT).Если вы связываетесь с динамической C-клиентской библиотекой, связывайтесь либо статически, либо динамически с C-времени выполнения (используйте либо опцию компилятора
/MT, либо/MD).
-
Для MySQL C-клиентской библиотеки из коммерческого распространения MySQL:
Если вы связываетесь со статической C-клиентской библиотекой, связывайтесь статически с C-времени выполнения (используйте опцию
/MT).Если вы связываетесь с динамической C-клиентской библиотекой, связывайтесь либо статически, либо динамически с C-времени выполнения (используйте либо
/MT, либо/MD).
В общем случае при связывании со статической MySQL C-клиентской библиотекой клиентская библиотека и приложение-клиент должны использовать те же опции компилятора при связывании C-времени выполнения — то есть, если ваша C-клиентская библиотека скомпилирована с опцией /MT, ваше приложение-клиент также должно быть скомпилировано с опцией /MT и так далее (см. страницу MSDN, описывающую опции связывания C-библиотеки для получения более подробной информации). Следуйте этому правилу, когда создаёте свою статическую MySQL C-клиентскую библиотеку из исходного распределения MySQL и связываете ваше приложение-клиент с ней.
Режим отладки: Из-за упомянутого правила связывания вы не можете создать приложение в режиме отладки (с опциями компилятора /MTd или /MDd) и связать его со статической C-клиентской библиотекой, созданной Oracle, которая не создана с опциями отладки. Вместо этого вы должны создать статическую клиентскую библиотеку из исходного кода с опциями отладки.
Решение проблем при подключении к библиотеке клиентов MySQL
Библиотека клиентов MySQL включает встроенную поддержку SSL. Не нужно указывать ни -lssl, ни -lcrypto при подключении. Это может, на самом деле, привести к проблемам во время выполнения.
Если компоновщик не может найти библиотеку клиентов MySQL, вы можете получить ошибки undefined-reference для символов, начинающихся с mysql_, например, такие, как показаны здесь:
/tmp/ccFKsdPa.o: In function `main':
/tmp/ccFKsdPa.o(.text+0xb): undefined reference to `mysql_init'
/tmp/ccFKsdPa.o(.text+0x31): undefined reference to `mysql_real_connect'
/tmp/ccFKsdPa.o(.text+0x69): undefined reference to `mysql_error'
/tmp/ccFKsdPa.o(.text+0x9a): undefined reference to `mysql_close'
Вы можете решить эту проблему, добавив -L в конец вашей команды компоновки, где dir_path
-lmysqlclientdir_path представляет имя пути к каталогу, где расположена библиотека клиентов. Чтобы определить правильный каталог, попробуйте эту команду:
mysql_config --libs
Вывод команды mysql_config может указать и другие библиотеки, которые также следует указать в команде компоновки. Вы можете включить вывод mysql_config напрямую в вашу команду компиляции или компоновки, используя обратные кавычки. Например:
gcc -o progname progname.o `mysql_config --libs`
Если при компоновке возникает ошибка, что символ floor не определен, подключитесь к математической библиотеке, добавив -lm в конец строки компиляции/компоновки. Аналогично, если у вас возникают ошибки undefined-reference для других функций, которые должны существовать в вашей системе, таких как connect(), проверьте страницу справки для соответствующей функции, чтобы определить, какие библиотеки нужно добавить в команду компоновки.
Если у вас возникают ошибки undefined-reference, такие как приведенные ниже, для функций, которые отсутствуют в вашей системе, это обычно означает, что ваша библиотека клиентов MySQL была скомпилирована на системе, которая не на 100% совместима с вашей:
mf_format.o(.text+0x201): undefined reference to `__lxstat'
В этом случае вы должны загрузить дистрибутив исходного кода последней версии MySQL и самостоятельно скомпилировать библиотеку клиентов MySQL. См. .
© 2025 Oracle
Licensed under the GPLv2 License.