dポイントプレゼントキャンペーン実施中!

「mysqlclient」の事が分からないでいます。

Cからmysql接続をするプログラムを作っていたのですが、

makefileに「-lmysqlclient」を入れておけよ!
と先輩に言われたので、

そのとおり、
それをLDFLAGSに追加しておいたら、
確かに、コンパイルが出来て、
mysql接続も成功していたのですが、
どうも自分で分からない事が有ります。

「mysql.h」をCプログラムの先頭でincludeしたり、
「mysql.h」ファイルの位置を
MakefileのLDFLAGSに書いて、
mysqlの関数を使うための下地を作っておくなら
何となく理解出来るのですが、


どうして、
「-lmysqlclient」をすべきなのでしょうか。
「mysqlclient」を探しても、
特にそんなファイルなども見つかりませんでしたしが、
確かに、この「-lmysqlclient」をなくしてしまうと、
コンパイルが上手く通らないです。

「mysqlclient」とは何なのでしょうか。
どうして、mysqlのAPIを使うのに、
mysql.hだけではなく、「mysqlclient」も必要なのでしょうか?

Cを勉強しだしたばかりの弱小者ですが、
アドバイスをいただいた先輩も出張に行ってしまい、
聞ける人もいないため、
アドバイスいただけるとありがたいです。
宜しくお願い致します。

A 回答 (3件)

>どうして、


>「-lmysqlclient」をすべきなのでしょうか。

libmysqlclient.soにある関数を使用するから…です。
リンカにどこのライブラリに使用する関数があるのか、指定しないとリンクできないでしょう。
# できあがったバイナリを実行するときにOSがロードし、プロセス空間にマッピングしてくれます。

>特にそんなファイルなども見つかりませんでしたしが、

場所によるのでしょうが……手元のCentOS5.4では、
/usr/lib/mysqlの下にlibmysqlclient.so.15というのがあります。

>どうして、mysqlのAPIを使うのに、
>mysql.hだけではなく、「mysqlclient」も必要なのでしょうか?

mysql.hにはプロトタイプ宣言などだけでmysqlの機能を使用するのに必要な関数の実体がないから…です。
    • good
    • 0
この回答へのお礼

Wr5さん!

教えていただきありがとうございます。
すごく分かりやすく感謝しております。

確かに、
「mysqlclient」では探すことが出来ませんでしたが、
「libmysqlclient.so」や「libmysqlclient.so.15」
というのはありました!(fedora9)


----
# locate libmysqlclient

/lib/mysql++-3.0.9/libmysqlclient.def
/usr/lib/mysql/libmysqlclient.a
/usr/lib/mysql/libmysqlclient.so
/usr/lib/mysql/libmysqlclient.so.15
/usr/lib/mysql/libmysqlclient.so.15.0.0
/usr/lib/mysql/libmysqlclient_r.a
/usr/lib/mysql/libmysqlclient_r.so
/usr/lib/mysql/libmysqlclient_r.so.15
/usr/lib/mysql/libmysqlclient_r.so.15.0.0
----

つまり、
「mysqlclient」というファイルがあるというのではなく、
「libmysqlclient.so」に入っているAPIを使うために、
「mysql.h」だけではなく、
「mysqlclient」をリンクさせているのですね!

続けての疑問で大変恐縮ですが、
何故、
「libmysqlclient.so」の中のAPIを使うのに、
「libmysqlclient.so」をリンクさせるのではなく、
「mysqlclient」をリンクさせているのでしょうか?

つまり、ファイル名でもないのに、
どうしてリンク先に「mysqlclient」という言葉が発想されたのか?が
どうしても分からないです。

物分りが悪くすいませんが教えて頂けるととてもありがたいです。
宜しくお願い致します。

お礼日時:2010/01/21 10:06

>続けての疑問で大変恐縮ですが、


>何故、
>「libmysqlclient.so」の中のAPIを使うのに、
>「libmysqlclient.so」をリンクさせるのではなく、
>「mysqlclient」をリンクさせているのでしょうか?

細かい経緯は知りませんが…
リンカがそういう作りになっているから…としか。

man ldより…
-lar アーカイブファイル ar をリンクするファイルのリストに加える。このオプションは何回でも指定できる。 ld は ar が指定されるごとに、 libar.a が見つかるまで検索パスを探す。
ということで、リンクするのに使用されたのは「libmysqlclient.a」でしょうか。
私のところにはmysqlの開発用パッケージが入っていないのでlibmysqlclient.aは見つからなかったのでしょう。
    • good
    • 0
この回答へのお礼

Wr5さん!

2度にわたりご回答ありがとうございました!
色々と勉強になりました。
ありがとうございました!

お礼日時:2010/01/22 15:12

環境が掛かれていないようですので、補足にお願いします。

    • good
    • 0
この回答へのお礼

Yanchさん
ご回答ありがとうとざいました。

情報不足で失礼しました。
OSはFedora9を利用しており、そこでCのプログラムを書いていました。
MySQLはMySQL3.0を利用しています。

お礼日時:2010/01/21 10:10

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!