読者です 読者をやめる 読者になる 読者になる

意味悲鳴

PythonとかUnityとか.技術ブログでしたが,研究ブログにシフトしました.

Ubuntu14.04でsem_open(semaphore.h内の関数)が無いって言われた時のお話

C言語

課題やってたら課題と関係ないところで怒られて腹が立ったので書いておきます。
先に環境を。

ホスト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)

上のリンクにあるとおり、UNIXccgccではない)コマンドのオプションでは-lpthreadの方が正しいようで。じゃあなんで学校のCentOSでは動いたんだろうっていう。

stackoverflow.com

linux.die.net

Stack Overflowの回答を見るに、とりあえずどっちかのオプション使ってみて、それで動かなかったらもう片方を使っておけ、そうでもないなら-pthreadで動かせってことみたいです。Linuxディストリビューションか、あるいはgccのバージョンかのどちらかによって使用するオプションが変わるのかも。

追記
別のプログラムにおいて、semaphore.hと同時に使用していた<sys/mman.h>内の関数に必要なオプションは-lrtが無いと通りませんでした。要するに、CentOS上で必要だったオプションはsys/mman.hに対する-lrtのみで、Ubuntuだとそこにsemaphore.hに対するオプションを足して-lrt -lpthreadとする必要があったというお話みたいです。

shm_open(3) - Linux manual page