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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
march3

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

#1

投稿記事 by march3 » 10年前

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 調査方法などご教授願えると助かります。
よろしくお願いします。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

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

#2

投稿記事 by みけCAT » 10年前

どうしても*.soの形でライブラリを作りたいのでなければ、DLLを作ることを検討してください。
Cygwinでの共有オブジェクト (DLL) の作り方 | Netsphere Laboratories
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

ISLe
記事: 2650
登録日時: 13年前
連絡を取る:

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

#3

投稿記事 by ISLe » 10年前

Cygwinで作ったlibhoge.soの中身は既にDLLですね。
単に-lオプションで探すファイル名のパターンがLinuxとCygwinで異なるというだけです。

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

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

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

march3

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

#4

投稿記事 by march3 » 10年前

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側で考慮してもらいたい・・・)

ISLe
記事: 2650
登録日時: 13年前
連絡を取る:

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

#5

投稿記事 by ISLe » 10年前

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

閉鎖

“C言語何でも質問掲示板” へ戻る