ページ 11

cygwinで自作ライブラリのリンク

Posted: 2014年2月22日(土) 13:16
by march3
ubuntuのgccでコンパイルして共有ライブラリ(libhoge.so)にしたソース(hoge.c)があります

コード:

 gcc -O2 -c hoge.c 
 gcc -o libhoge.so -shared hoge.o
これど同じものをWindowsで使いたいので、上と同じコマンドを実行し、共有ライブラリ(libhoge.so)を作りました。
libhoge.soはできたのですが、リンクができません

ubuntu上では環境変数 LD_LIBRARY_PATH を設定し、

コード:

 export LD_LIBRARY_PATH=$HOME/lib
以下でリンクしていました

コード:

 gcc sample.c -L$HOME/lib -lhoge
しかし、Cygwinだとなぜかリンクできなくて困っています。

コード:

 echo $SHELL
/bin/bash
 export LD_LIBRARY_PATH=$HOME/lib
 gcc sample.c -L$HOME/lib -lhoge
/usr/lib/gcc/x86_64-pc-cygwin/4.8.2/../../../../x86_64-pc-cygwin/bin/ld: -lhoge が見つかりません
collect2: エラー: ld はステータス 1 で終了しました
cygwinのバージョンは以下です

コード:

$ uname -a
CYGWIN_NT-6.1 ******* 1.7.27(0.271/5/3) 2013-12-09 11:54 x86_64 Cygwin

$ cygcheck -c cygwin
Cygwin Package Information
Package              Version        Status
cygwin               1.7.27-2       OK

$ gcc --version
gcc (GCC) 4.8.2
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
原因 or 調査方法などご教授願えると助かります。
よろしくお願いします。

Re: cygwinで自作ライブラリのリンク

Posted: 2014年2月22日(土) 16:01
by みけCAT
どうしても*.soの形でライブラリを作りたいのでなければ、DLLを作ることを検討してください。
Cygwinでの共有オブジェクト (DLL) の作り方 | Netsphere Laboratories

Re: cygwinで自作ライブラリのリンク

Posted: 2014年2月22日(土) 18:09
by ISLe
Cygwinで作ったlibhoge.soの中身は既にDLLですね。
単に-lオプションで探すファイル名のパターンがLinuxとCygwinで異なるというだけです。

-lオブションを使わずに $HOME/lib/libhoge.so と直接ファイル名を指定したらリンクできることを確認しました。
実行にも問題がないようです。

-lオプションを使いたいのであればファイル名をCygwin流に合わせる(libhoge.so→libhoge.dll)必要があります。
4.8.2とのことなので、ファイル名の頭のlibは付けても付けなくても-lオプションで見付けてくれます。

実行ファイル名はライブラリに埋め込まれて、あとからライブラリのファイル名を変更しただけでは実行時に元の名前で探します。
注意してください。

Re: cygwinで自作ライブラリのリンク

Posted: 2014年2月23日(日) 11:46
by march3
ISLe さんが書きました:Cygwinで作ったlibhoge.soの中身は既にDLLですね。
単に-lオプションで探すファイル名のパターンがLinuxとCygwinで異なるというだけです。

-lオブションを使わずに $HOME/lib/libhoge.so と直接ファイル名を指定したらリンクできることを確認しました。
実行にも問題がないようです。

-lオプションを使いたいのであればファイル名をCygwin流に合わせる(libhoge.so→libhoge.dll)必要があります。
4.8.2とのことなので、ファイル名の頭のlibは付けても付けなくても-lオプションで見付けてくれます。

実行ファイル名はライブラリに埋め込まれて、あとからライブラリのファイル名を変更しただけでは実行時に元の名前で探します。
注意してください。
要するにファイル名に気をつけるということですね。
リンク時に直接指定するのは、複数のライブラリをリンクしたい時に面倒なので、dllにします。
(なぜこんな仕様なんだろう。ファイル名の互換くらいCygwin側で考慮してもらいたい・・・)

Re: cygwinで自作ライブラリのリンク

Posted: 2014年2月23日(日) 17:57
by ISLe
march3 さんが書きました:(なぜこんな仕様なんだろう。ファイル名の互換くらいCygwin側で考慮してもらいたい・・・)
もし実行ファイルにexe拡張子が付かないとCygwinのシェルからしか実行できなくなりますね。
ウィンドウズ環境の中で同時利用できないならCygwinを使うメリットはないと思います。