C言語でMySQLへ接続
「【未解決だけど解決?】mysql_configが存在しない」で、mysql_configが入らなくて困っていたのは、全てこのため。
C言語でMySQLへ接続するプログラムを書きたかった。
Javaなら簡単だけど、C言語では書いたことがないのでイキナリ苦労した。
まず、手始めに次のようなプログラムを記述してmysql.hが読み込まれるかを確認する。
#include <stdio.h> #include <stdlib.h> #include <mysql/mysql.h> int main(){ return 0; }
そのようなファイルは存在しないと怒られたら、libmysqlclientをインストールする。
Ubuntuなので次のようにした。
$ sudo apt-get install libmysqlclient-dev
インストールされたかを確認する。
$ ls /usr/include/mysql/
decimal.h my_dbug.h mysqld_ername.h plugin_ftparser.h
errmsg.h my_dir.h mysqld_error.h plugin.h
keycache.h my_getopt.h mysql_embed.h sql_common.h
m_ctype.h my_global.h mysql.h sql_state.h
m_string.h my_list.h mysql_time.h sslopt-case.h
my_alloc.h my_net.h mysql_version.h sslopt-longopts.h
my_attribute.h my_pthread.h my_sys.h sslopt-vars.h
my_compiler.h mysql my_xml.h typelib.h
my_config.h mysql_com.h plugin_audit.h
作成したプログラムをコンパイルする。
$ gcc -o mysqlConnector mysqlConnector.c $ ls mysqlConnector mysqlConnector.c mysqlConnector.c~
MySQLに接続するソースコードにする。
ソースコードはここを参照。
#include <stdio.h> #include <stdlib.h> #include <mysql/mysql.h> #define DBHOST "localhost" #define DBUSER "myuser" #define DBPASS "mypass" #define DBNAME "mydb" int main() { MYSQL *conn; MYSQL_RES *res; MYSQL_ROW row; // 接続 conn = mysql_init(NULL); if (!mysql_real_connect(conn, DBHOST, DBUSER, DBPASS, DBNAME, 3306, NULL, 0)) { fprintf(stderr, "%s\n", mysql_error(conn)); exit(1); } // 切断 mysql_close(conn); return 0; }
コンパイルする。
$ gcc -o mysqlConnector mysqlConnector.c /tmp/ccpDFeRI.o: In function `main': mysqlConnector.c:(.text+0x11): undefined reference to `mysql_init' mysqlConnector.c:(.text+0x59): undefined reference to `mysql_real_connect' mysqlConnector.c:(.text+0x69): undefined reference to `mysql_error' mysqlConnector.c:(.text+0x9b): undefined reference to `mysql_close' collect2: error: ld returned 1 exit status
エラーとなる。
ライブラリをリンクするが、ライブラリの場所が分からないので調べる。
これを調べるためにmysql_configが必要だった。だから「【未解決だけど解決?】mysql_configが存在しない」で苦労してでもインストールした。
$ mysql_config --libs -L/usr/lib/i386-linux-gnu -lmysqlclient -lpthread -lz -lm -ldl
ライブラリをリンクして再度コンパイルする。
$ gcc -L/usr/lib/i386-linux-gnu -lmysqlclient -o mysqlConnector mysqlConnector.c /tmp/cccC1SBM.o: In function `main': mysqlConnector.c:(.text+0x11): undefined reference to `mysql_init' mysqlConnector.c:(.text+0x59): undefined reference to `mysql_real_connect' mysqlConnector.c:(.text+0x69): undefined reference to `mysql_error' mysqlConnector.c:(.text+0x9b): undefined reference to `mysql_close' collect2: error: ld returned 1 exit status
これでも駄目なのか。。。
mysql_configの結果をそのままオプショにつけてコンパイルしてみる。
$ gcc -L/usr/lib/i386-linux-gnu -lmysqlclient -lpthread -lz -lm -ldl -o mysqlConnector mysqlConnector.c /tmp/cc5KCl8q.o: In function `main': mysqlConnector.c:(.text+0x11): undefined reference to `mysql_init' mysqlConnector.c:(.text+0x59): undefined reference to `mysql_real_connect' mysqlConnector.c:(.text+0x69): undefined reference to `mysql_error' mysqlConnector.c:(.text+0x9b): undefined reference to `mysql_close' collect2: error: ld returned 1 exit status
それでも駄目。
何がおかしいのか分からないが試しにオプションを最後にしてみる。
$ gcc -o mysqlConnector mysqlConnector.c -L/usr/lib/i386-linux-gnu -lmysqlclient $ ls mysqlConnector mysqlConnector.c mysqlConnector.c~
コンパイル成功!
DBからデータを取得するようにプログラムを変更する。
プログラムはここから引用。
#include <stdio.h> #include <stdlib.h> #include <mysql/mysql.h> #define DBHOST "localhost" #define DBUSER "myuser" #define DBPASS "mypass" #define DBNAME "mydb" int main() { MYSQL *conn; MYSQL_RES *res; MYSQL_ROW row; // 接続 conn = mysql_init(NULL); if (!mysql_real_connect(conn, DBHOST, DBUSER, DBPASS, DBNAME, 3306, NULL, 0)) { fprintf(stderr, "%s\n", mysql_error(conn)); exit(1); } // クエリ発行 if (mysql_query(conn, "show tables")) { fprintf(stderr, "%s\n", mysql_error(conn)); exit(1); } res = mysql_use_result(conn); // 結果表示 while ((row = mysql_fetch_row(res)) != NULL) { printf("%s\n", row[0]); } mysql_free_result(res); // 切断 mysql_close(conn); return 0; }
コンパイルして実行する。
$ gcc -o mysqlConnector mysqlConnector.c -L/usr/lib/i386-linux-gnu -lmysqlclient $ ./mysqlConnector testTbl usdjpyPriceTbl