C言語(Windows環境)からMySQL #3 コンパイル編
C言語(Windows環境)からMySQL #3 コンパイル編
C言語(Windows環境)からMySQL #3 コンパイル編
前回に引き続き、Windows環境でC言語を使っていて不意にMySQLとの接続を試みます。検索してもWindowsのコマンドプロンプト(文字コード:cp932)からC言語でMySQLにアクセスしているような非実用的でド変態なサンプルがあまり見当たらない(見つかってもコンパイラが違っていたり、Visual Studioを使っていたり、コマンドプロンプトベースじゃなかったりして筆者の環境に合わない)ので、試行錯誤をした結果を備忘録代わりにメモ。
コピペでサンプルが動かないなら自力でサンプルを作ればいいじゃない
なお、今回は安全性や動作速度などは一切考えずにあくまでも「Windowsのコマンドプロンプトから直接MySQLを使えるプログラムをC言語で作る」ことに注力しています。
セキュリティ面や動作速度、バグの有無などは考慮に入れていませんので参考にする場合はそのあたりにはお気を付けの上、自己責任で利用してください。
また、コンパイルのコマンドだけ知りたい!!という方は【この記事の下の方】にまとめてあるコンパイルコマンドまとめをご覧ください。下記のコマンドでコンパイルしてみてください。
gcc Sample.c -I ".\mysql-connector-c-6.1.10-winx64\Include" -L ".\mysql-5.5.56-winx64\lib" -llibmysql -o Sample.exe
↑説明が長すぎるので記事の下から持ってきました。
開発環境
C言語
C言語の環境はこちらー>環境導入前編 環境導入後編 おまけその1 おまけその2
MySQLの環境は以下のものを用意しました。
MySQL 5.5.56(zip形式のものをダウンロード、解凍して使用)
Connector/Cは以下のものを用意しました。
Connector/C 6.1.10(zip形式のものをダウンロード、解凍して使用)
本記事は以上の環境を前提に説明を行います。
C言語からMySQLを利用する手順
C言語からMySQLを利用する手順
C言語からMySQLを利用するための手順は大雑把に書くと以下の通りです。
4.コンパイルする ← 今回はココ
他の環境(Javaとか)から簡単に叩けるんだし、楽勝!!・・・と思ったら、コンパイルで思いっきり詰まって悔しかったのでメモに残したのは内緒。
前回までで3のソース作成が終わったのでので今回はコンパイルを試みます。
4.コンパイルする
Windows環境でC言語を利用してMySQLを使用するソースが書けた(はずな)ので今回はコンパイルします。
ソースコードとフォルダの配置ははこちらをご覧ください。細かい解説は次々回あたりかな?
これでひとまずソースも書けたし、あとはコンパイルするだけ(^^
gcc Sample.c
これでうまく。。。
いかないΣ(゜O゜
ならこれはどうだ!!
gcc -c Sample.c
これもだめ!? Σ(゜O゜
なぜ!?
コンパイルの仕組み
そもそもC言語のプログラムが実行ファイルになるまでの間には以下のような手順を経ています。
【1】ソースコード(.c ファイル)からオブジェクトファイル【※1】(.o ファイル)に変換する
【2】オブジェクトファイル(.o ファイル/.obj ファイル)やライブラリ【※2】をリンカで束ねて実行ファイル(.exe ファイル/.out ファイル)にする
※1 「オブジェクトファイル」という名前ですが、javaなどで言う「オブジェクト指向」のオブジェクトとはニュアンスが異なります。ここでいうオブジェクトファイルとは、実行ファイルを作成するために必要な「実行ファイルを作るための部品」とでも捉えてください。
※2 ライブラリとは図書館ですね(^^ 様々な関数などが入っているものです。他の人が書いた本を図書館で借りて読むように、他の人がまとめてくれた関数をライブラリを取り込んで使う、というイメージです。例え話でほんとに図書館出てきたよΣ(゜o゜
普段のコンパイルでは【1】と【2】を一気に行うようにしています。コンパイルの際に -c オプションを付けることで、【1】のオブジェクトファイルへの変換のみになります。
【2】は通常通り gcc コマンドで束にしたいファイルすべてを指定すれば大丈夫です。
-o オプションについては、作成されるファイルの名前を指定するオプションです。省略可能です。
具体的には以下のようなイメージです。
Sample.c(ソースコード)
↓ gcc -c Sample.c 【1】 //ソースをもとに部品作成
Sample.o(オブジェクトファイル)
↓ gcc Sample.o -o Sample.exe 【2】 //部品を組み合わせてプログラム完成
Sample.exe(実行ファイル)
【1】のオブジェクトファイルを作成するためには、ソースコード中で使用しているヘッダファイルなどを取り込む(include)必要があります。何もオプションを指定しない場合に取り込めるのは標準ヘッダファイルと、ソースコードと同じフォルダにあるヘッダファイルのみになります。
【2】の実行ファイルを作成するためには、実行ファイルの生成に必要なオブジェクトファイルをすべてリンカで束ねないといけません。この際、指定しなかったファイルは束ねる対象になりません。
いつものコンパイル方法では
【1】 : ヘッダファイル(mysql.h)がどこにあるのかわからないため取り込めない。
【2】 : mysqlを利用するために必要なオブジェクトファイルのがどこにあるのかわからないため束にできない。
という理由からコンパイルに失敗してしまったのです。
つまり ↓ これではコンパイル出来ない Σ(゜O゜
gcc Sample.c
コンパイルに必要なもの
今回のサンプルをコンパイルするためにはコンパイル時にオプションを付けてincludeしたいヘッダファイルやリンカで束にしたいファイルがあるディレクトリを指定する必要があります。
ディレクトリ配置は前回の通りになっている前提で説明をしています。ディレクトリ名が紛らわしいので(※)と(★)で区別します。
また、今回の解説では【1】と【2】は別々に実行するようにします。コンパイルのコマンドだけ知りたい場合や、【1】と【2】をまとめて実行したい場合はこのブログの最後をご覧ください。
オプションその1 -I オプション(アルファベット大文字のアイ)
-I オプションは、includeしたいヘッダファイルのあるディレクトリを指定する際に使用します。【1】で ソースコードからオブジェクトファイルを生成する際に使用します。
使い方は下記の通りです。dir には実際に include したいヘッダファイルが入ったディレクトリを指定します。
gcc -c Sample.c -I dir
今回は Sample.c の中で mysql.h を include しています。このファイルはconnector/Cのincludeディレクトリ(※のついているほうのincludeディレクトリ)の中にあります。
この mysql.h をincludeしたいのでコンパイル時に以下のように指定します。
gcc -c Sample.c -I ".\mysql-connector-c-6.1.10-winx64\Include"
MySQL本体のincludeディレクトリ(前回の★の方)にも同じ mysql.h という名前のファイルがあります。
今回使用するのはconnector/Cのincludeディレクトリ(※)に入っている方のmysql.hなのでを間違えないように注意しましょう。
また、今回は “” は付けなくても大丈夫です。指定したいディレクトリ名に 半角スペース が入っている場合は必ず “” でディレクトリ名を囲んでください。
ディレクトリ名の先頭の . (ドット/ピリオド)はカレントディレクトリ(現在のディレクトリ)を指す相対パスです。
オプションその2 -l オプション(アルファベット小文字のエル)
-l オプションはライブラリをリンクする際に使用します。【2】でオブジェクトファイルやライブラリを束にして実行ファイルを生成する際に使用します。
使い方は以下の通りです。libには実際に使用したいライブラリ名を指定します。
gcc Sample.o -l lib
今回はMySQLとやり取りするために様々な関数を使っています。そこで、Sample.oからSample.exeを生成する際に、libmysqlというライブラリをリンクする必要があります。
コンパイル時に下記のように指定します。
gcc Sample.o -llibmysql -o Sample.exe
ただし、これだけでは【コンパイルに失敗】します。
オプションその3 -L オプション(アルファベット大文字のエル)
ライブラリを使おうとしても、そのライブラリがどこにあるのかわからないと使えません。そのため今回は -l オプションだけではコンパイルエラーを起こします。
そこで -L オプションを利用します。-Lオプションはライブラリがどこにあるのかを指定する際に使用します。-l オプション同様、【2】でオブジェクトファイルやライブラリを束にする際に使用します。
使い方は以下の通りです。dirには実際にリンクしたいライブラリが入ったディレクトリを指定します。
gcc Sample.o -L dir
今回はMySQLとやり取りをするためにlibmysqlというライブラリをリンクしています。そのlibmysqlの本体がどこにいるのかを指定する必要があります。
libmysqlライブラリの本体は、MySQL本体のlibディレクトリ(★)の中にあります。
そのため、コンパイル時に以下のように指定します。
gcc Sample.o -L ".\mysql-5.5.56-winx64\lib" -llibmysql -o Sample.exe
-L オプションが先、-l オプションが後なので注意してください。環境によっては逆にするとコンパイルエラーを起こします。(筆者環境では逆でも大丈夫でした。)
-I オプション同様、今回は””は付けなくても大丈夫です。.(ドット/ピリオド)はカレントディレクトリです。
connector/Cのlibディレクトリ(※)の方にもライブラリ本体がいます。こちらを指定すると実行時にうまくいきません。以前は失敗したのですが、今回はうまくいくようです。環境の違い?とりあえず動くからいいか
コンパイルコマンドまとめ
以上をまとめて、コンパイル時は以下のように指定します。
【1】ソースコード → オブジェクトファイル
gcc -c Sample.c -I ".\mysql-connector-c-6.1.10-winx64\Include"
【2】オブジェクトファイル/ライブラリ → 実行ファイル
gcc Sample.o -L ".\mysql-5.5.56-winx64\lib" -llibmysql -o Sample.exe
【1】【2】を一気にやる場合
※-I -L -l の順番が違うと環境によってはコンパイルエラーがでます。(筆者環境ではエラーになりませんでした。)
gcc Sample.c -I ".\mysql-connector-c-6.1.10-winx64\Include" -L ".\mysql-5.5.56-winx64\lib" -llibmysql -o Sample.exe
問題のコンパイルもできたし、後は実行するのみ(^ω^)
その辺のアルバイトよりよっぽど簡単なお仕事♪(^ω^
Sample.exe
… (^ω^)
!?じ、実行ができない!? Σ(゜∀゜
なぜだ~ Σ(゜O゜
筆者のおすすめ記事
MinGW-w64とmsys2で作るC言語環境構築
C言語練習問題一覧
C言語でBINGOを作ろうシリーズ記事一覧
実践力が身につくC言語講座 連載リンク
競技プログラミングをイメージしたライブラリ活用講座
競技プログラミング風-標準Cライブラリ入門 連載
アルゴリズムをマスターして技術力アップ!
実践アルゴリズム講座 連載
パズルゲームの解析をテーマにしたC++講座
ゲーム解析プログラミング 連載