アットウィキロゴ

Cの導入(Ubuntu12.04 with VMware)

Cのコンパイルについて。
(Cを書けない、読めない人間が他人様のプログラムをコンパイルする際にぶち当たった問題に対するメモ)

なお環境としては、ubuntu 12.04。
math.hに含まれる関数(要するによく使う数学の関数)を使おうとすると(つまり、 #include <math.h>が入っていると)、
コンパイル時にコケるという現象に直面。
コンパイルはhoge.cというプログラムだとすると

gcc -lm hoge.c -o hoge.o

とやった。

上のコマンドのように-lmをオプションで指定すると、
前半部分の -l はライブラリのパスを明示的に与えることを意味し、
最後のmは libm.a (math.hが使っている。すべてライブラリはlib*.aという名前なのでmとしただけでlibm.aとわかるという仕組みらしい)というライブラリを探せ、という指令、
なので、gcc内でパスの切ってある場所でlibm.aを探せ、という意味になる。
普通、これでうまくいくそうである。

これがうまくいかなかったということは、パスがおかしいのか?と思い

gcc -print-search-dirs

とやってgccがライブラリを探す参照パスを表示させたうえで、
libm.aの実体を色々探した。
最終的に
/usr/lib/i384-linux-gnu
にあることが分かったが、ここはすでに参照パスが切ってある場所…。

ちなみにubuntu 11.04以降ではCのライブラリの位置関係が大幅に移動を食らっている模様。
/usr/libなどではなく、/usr/lib/i386-linux-gnuなどに移動されている。(32bitの場合)
恐らくこれまでにもたくさんの人がこれに引っかかったのだろう(実際ぐーぐる先生にお伺いを立てるといっぱい引っかかる。)、
今(2013年1月現在)ではインストール時に正しいパスを切ってあるということのようである。

じゃー、なんでコンパイル通らないんだーと思ってさらに調べてみると、
http://askubuntu.com/questions/130373/ubuntu-12-04-compiling-a-c-program
こんなページが引っかかった。
原理は分からないけど、素直に

gcc hoge.c -lm

とやったところ、きちんと実行ファイルa.outを吐き出した。
もちろん、

gcc hoge.c -o hoge.o -lm

とやればhoge.oという実行ファイルになる。
理由は不明だが、できるようになった。
ubuntu特有の現象なのかどうか、暇があれば調べてみるのもよいか…。

タグ:

+ タグ編集
  • タグ:
最終更新:2013年06月03日 16:38