Ubuntu14.04でsem_open(semaphore.h内の関数)が無いって言われた時のお話
課題やってたら課題と関係ないところで怒られて腹が立ったので書いておきます。
先に環境を。
ホストOS Windows10 Home 64bit
ゲストOS Ubuntu14.04(VirtualBox5.0.8)
gcc 4.8.4
で、課題のプログラムビルドしようとしたらこのザマです。
zyusou@zyusou:semaphore$ gcc -o psem psem.c -lrt /tmp/cc1j3HxN.o: 関数 `main' 内: psem.c:(.text+0x3d): `sem_open' に対する定義されていない参照です psem.c:(.text+0xf8): `sem_close' に対する定義されていない参照です /tmp/cc1j3HxN.o: 関数 `prchar' 内: psem.c:(.text+0x12f): `sem_wait' に対する定義されていない参照です psem.c:(.text+0x1b6): `sem_post' に対する定義されていない参照です collect2: error: ld returned 1 exit status
こんな感じでsemaphore.h内の関数が使えない事があります。これ、gccのオプションの指定が間違えていたっぽくて。
zyusou@zyusou:semaphore$ gcc -o psem psem.c -lpthread
これで通ります。学校で指定された時はCentOS6の実機環境で-lrt
オプションでビルド通ったんですけど、帰宅して仮想環境のUbuntu14.04だと-lpthread
じゃないと通らないという。何なんだろうこれ。(この件について下記に追記済み)
UNIX ccコマンド(Hishidama's UNIX-command "cc" Memo)
上のリンクにあるとおり、UNIXのcc
(gcc
ではない)コマンドのオプションでは-lpthread
の方が正しいようで。じゃあなんで学校のCentOSでは動いたんだろうっていう。
Stack Overflowの回答を見るに、とりあえずどっちかのオプション使ってみて、それで動かなかったらもう片方を使っておけ、そうでもないなら-pthread
で動かせってことみたいです。Linuxのディストリビューションか、あるいはgccのバージョンかのどちらかによって使用するオプションが変わるのかも。
追記
別のプログラムにおいて、semaphore.hと同時に使用していた<sys/mman.h>内の関数に必要なオプションは-lrt
が無いと通りませんでした。要するに、CentOS上で必要だったオプションはsys/mman.hに対する-lrt
のみで、Ubuntuだとそこにsemaphore.hに対するオプションを足して-lrt -lpthread
とする必要があったというお話みたいです。