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