Gentoo coLinux で MinGW クロスコンパイル >> 雑多な疑問と不正確な回答
ホスト環境でこのエラーが表示される場合、pthread をリンクするようにします。リンカに -lpthread を渡します。
クロス環境で表示されるのであれば、コンパイラがクロス環境用のインクルードファイルを参照していないことを表しています。C_INCLUDE_PATH などが正しく設定されているか確認してください。
gcc に渡すパラメータには順序があり、参照元ファイル、参照先ファイルの順に指定する必要があります。通常は出力ファイル名、オブジェクト、ライブラリの順に指定すればリンクが通ります。
Makefile が暗黙のターゲットを使用し記述されている場合、 LDFLAGS のあとに続けてオブジェクト、出力ファイル名が指定されるため、このようなエラーが発生します。簡単なものであれば、手作業でエラー箇所のコマンドを抜き出して順序を変更しリンクすることで応急処置できます。
libtool が作成する la ファイルにコンパイルオプションが記録されているため、 makefile などを書き換え不要なコンパイルオプションをすべて削除しても、libtool を通して付加されます。リンク対象になっている la ファイルを確認してください。
dirent 構造体の内容が変更されたため古い dirent.h を使用してコンパイルされたバイナリでは SEGV する可能性があります。新しい mingw-runtime に添付されている dirent.h および libmingwex.a を読み込むようにしてください。
Tor Lillqvist 氏が配布されている dirent.h がインクルード検索パスに存在する場合はこの問題が発生します。
直接使用することはできないようです。 dsw/dsp ファイルを mingw-utils の dsw2mak により makefile に変換することでビルドできるかもしれません。
たとえば hoge.dsp を変換する場合、
で hoge.mak ファイルが作成されます。 make には -f オプションを付けてファイルを渡してやります。
デフォルトでは debug でビルドされます。 release でビルドするには make に CFG="hoge - Win32 Release" を渡してやります。
dll のインポート ライブラリが作成されない場合は、 def ファイルが用意されていれば dlltool を使いインポート ライブラリを作成します。次のようにコマンドを実行します。 -U オプションはエクスポート関数の頭にアンダースコア(_)を付加します。
MinGW FAQ にそのものずばりのトピックがあります。
MSVC のプログラムから MinGW DLL を呼び出すことや、その逆は可能ですか? - MinGW について頻繁に尋ねられる質問と回答(MinGW FAQ)
http://www.sixnine.net/cygwin/translation/mingw-do...
How can an MSVC program call a MinGW DLL, and vice versa? - MinGW - Frequently Asked Questions
http://www.mingw.org/mingwfaq.shtml#faq-msvcdll
libtool の問題により shared ライブラリを作成できない場合があります。この問題は libtool を書き換えて対処します。対象は configure が作成した libtool ファイルです。 /usr/bin/libtool を書き換えてはいけません。
前者は shared にするため。後者は ライブラリ名.dll.a の形式のライブラリを見つけられるようにするためです。configure に --enable-shared オプションをつけても修正しなければならないのは、 configure を調べて原因を探すべきですが、現状、そこまでできてません。
la ファイルには dll ファイルや a ファイルへのパスが記録されています。 libtool はこれらを参照しインストールを試みます。しかしパスが間違っているか、記録されているパスと同じ場所にインストールしようとしたとき、作業を中止します。
la ファイルを削除し再度 make install することで正しい la ファイルが作成され、正常にインストールできます。 la ファイルの削除は、たとえばソースの解凍先直下に build ディレクトリを作り作業している場合、その build をカレントにし、
を実行することで削除できます。重要なファイルを削除しないよう注意してください。 -i オプションをつけることで対話的に削除できます。慣れないうちは -i オプションをつけ注意深く確認することをお勧めします。
[2006/5/30tue] 追記。 *.lai ファイルも削除する必要があるかも。
環境変数 GIMP2_DIRECTOR, FONTCONFIG_PATH と --gimprc オプションを使用することで不完全ながら混在できます。バッチファイルに次のように記述し Gimp を起動します。
※ 動作チェックしてません。
<install directory>、<data directory>は適宜読み替えてください。
ホスト環境でこのエラーが表示される場合、pthread をリンクするようにします。リンカに -lpthread を渡します。
クロス環境で表示されるのであれば、コンパイラがクロス環境用のインクルードファイルを参照していないことを表しています。C_INCLUDE_PATH などが正しく設定されているか確認してください。
gcc に渡すパラメータには順序があり、参照元ファイル、参照先ファイルの順に指定する必要があります。通常は出力ファイル名、オブジェクト、ライブラリの順に指定すればリンクが通ります。
Makefile が暗黙のターゲットを使用し記述されている場合、 LDFLAGS のあとに続けてオブジェクト、出力ファイル名が指定されるため、このようなエラーが発生します。簡単なものであれば、手作業でエラー箇所のコマンドを抜き出して順序を変更しリンクすることで応急処置できます。
libtool が作成する la ファイルにコンパイルオプションが記録されているため、 makefile などを書き換え不要なコンパイルオプションをすべて削除しても、libtool を通して付加されます。リンク対象になっている la ファイルを確認してください。
dirent 構造体の内容が変更されたため古い dirent.h を使用してコンパイルされたバイナリでは SEGV する可能性があります。新しい mingw-runtime に添付されている dirent.h および libmingwex.a を読み込むようにしてください。
Tor Lillqvist 氏が配布されている dirent.h がインクルード検索パスに存在する場合はこの問題が発生します。
直接使用することはできないようです。 dsw/dsp ファイルを mingw-utils の dsw2mak により makefile に変換することでビルドできるかもしれません。
たとえば hoge.dsp を変換する場合、
${XMINGW}/cross dsw2mak hoge.dsp
で hoge.mak ファイルが作成されます。 make には -f オプションを付けてファイルを渡してやります。
${XMINGW}/cross make -f hoge.mak
デフォルトでは debug でビルドされます。 release でビルドするには make に CFG="hoge - Win32 Release" を渡してやります。
${XMINGW}/cross make -f hoge.mak CFG="hoge - Win32 Release"
dll のインポート ライブラリが作成されない場合は、 def ファイルが用意されていれば dlltool を使いインポート ライブラリを作成します。次のようにコマンドを実行します。 -U オプションはエクスポート関数の頭にアンダースコア(_)を付加します。
${XMINGW}/cross dlltool -U -d hoge.def -l hoge.dll.a
MinGW FAQ にそのものずばりのトピックがあります。
MSVC のプログラムから MinGW DLL を呼び出すことや、その逆は可能ですか? - MinGW について頻繁に尋ねられる質問と回答(MinGW FAQ)
http://www.sixnine.net/cygwin/translation/mingw-do...
How can an MSVC program call a MinGW DLL, and vice versa? - MinGW - Frequently Asked Questions
http://www.mingw.org/mingwfaq.shtml#faq-msvcdll
libtool の問題により shared ライブラリを作成できない場合があります。この問題は libtool を書き換えて対処します。対象は configure が作成した libtool ファイルです。 /usr/bin/libtool を書き換えてはいけません。
- allow_undefined_flag の値を supported にする。
- always_export_symbols の値を yes にする。
前者は shared にするため。後者は ライブラリ名.dll.a の形式のライブラリを見つけられるようにするためです。configure に --enable-shared オプションをつけても修正しなければならないのは、 configure を調べて原因を探すべきですが、現状、そこまでできてません。
la ファイルには dll ファイルや a ファイルへのパスが記録されています。 libtool はこれらを参照しインストールを試みます。しかしパスが間違っているか、記録されているパスと同じ場所にインストールしようとしたとき、作業を中止します。
la ファイルを削除し再度 make install することで正しい la ファイルが作成され、正常にインストールできます。 la ファイルの削除は、たとえばソースの解凍先直下に build ディレクトリを作り作業している場合、その build をカレントにし、
rm `find ./ -name \*.la`
を実行することで削除できます。重要なファイルを削除しないよう注意してください。 -i オプションをつけることで対話的に削除できます。慣れないうちは -i オプションをつけ注意深く確認することをお勧めします。
[2006/5/30tue] 追記。 *.lai ファイルも削除する必要があるかも。
環境変数 GIMP2_DIRECTOR, FONTCONFIG_PATH と --gimprc オプションを使用することで不完全ながら混在できます。バッチファイルに次のように記述し Gimp を起動します。
set GIMP_HOME=<install directory> set USER_DIR=<data directory> set GIMP2_DIRECTORY=%USER_DIR% set FONTCONFIG_PATH=%USER_DIR% rem set FONTCONFIG_FILE=font-cache-2 cd /d %GIMP_HOME%\bin gimp-2.2.exe --gimprc=%USER_DIR%\gimprc
※ 動作チェックしてません。
<install directory>、<data directory>は適宜読み替えてください。
タグ
このページへのコメント
The ablitiy to think like that shows you're an expert
http://www.facebook.com/profile.php?id=10000340672...
Makefile.am LDFLAGSの場合、
-lkernel32 でなく-Wl,-lkernel32とすると
一番最後に持ってきてくれます。
===
正しくライブラリを指定しても「参照が未解決です」と表示されリンクに失敗します。
gcc に渡すパラメータには順序があり、参照元ファイル、参照先ファイルの順に指定する必要があります。通常は出力ファイル名、オブジェクト、ライブラリの順に指定すればリンクが通ります。
Makefile が暗黙のターゲットを使用し記述されている場合、 LDFLAGS のあとに続けてオブジェクト、出力ファイル名が指定されるため、このようなエラーが発生します。簡単なものであれば、手作業でエラー箇所のコマンドを抜き出して順序を変更しリンクすることで応急処置できます。