2

Linux で開発された C++ プロジェクトがあり、Windows ユーザーの同僚に実行可能ファイルを渡して渡したいと考えています。

問題を調べたところ、 のi586-mingw32msvc-g++代わりに を使用してコンパイルする方法があることがわかりましたg++。また、このソリューションは、リンクされたライブラリを再構築する必要があるという問題を解決することも理解していました。MXE スクリプト ( http://mxe.cc/ ) を使用してこれを解決したいと考えていました。

私のmakefileは次のとおりです(私はこれが初めてで、提案は大歓迎です):

#main.make
CC = i586-mingw32msvc-g++
CFLAGS = -Wall -O2 
LDFLAGS =
SOURCES =  <list of cpp files> 
LDLIBS =  -L/usr/i586-mingw32msvc/lib/ -llapack -lblas -lgsl -lgslcblas -lm -lmingw32
OBJECTS=$(SOURCES:.cpp=.o)
EXECUTABLE = main_simple.exe

all: $(SOURCES) $(EXECUTABLE)

$(EXECUTABLE): $(OBJECTS) 
    $(CC) $(LDFLAGS) $(OBJECTS) -o $@ $(LDLIBS) 

.cpp.o:
    $(CC) $(CFLAGS) -c $<   

clean:
    rm *.o main_simple.exe ./Output/* ./Output/*/* ./Output/*/*/*

しようとするmakeと、次のような gsl 関連のエラーがたくさん表示されます。

 utilities.o:utilities.cpp:(.text+0x2d1): undefined reference to `_gsl_matrix_alloc'
 utilities.o:utilities.cpp:(.text+0x2dc): undefined reference to `_gsl_vector_alloc'
 ....
 utilities.o:utilities.cpp:(.text+0x42e): undefined reference to `_gsl_matrix_free'
 utilities.o:utilities.cpp:(.text+0x70f): undefined reference to `_gsl_fit_linear'
 utilities.o:utilities.cpp:(.text+0x722): undefined reference to `_gsl_stats_correlation'
 collect2: ld returned 1 exit status

これは、私が MXE でクロスビルドしたと思っていたライブラリをコンパイラが本当に見つけたということですか? 私に何ができる?

あるいは、cmakeよりクリーンなソリューションでしょうか?.exeこれを使用して Linux マシンからファイルを作成できますか? または、その場合、同僚に自分のマシンで再コンパイルするよう依頼する必要がありますか?

あなたが私に与えることができるどんな助けにも感謝します!

4

2 に答える 2

1

問題は、現在 (2016 年 11 月) 共有ライブラリとしての gsl のコンパイルが mxe で無効になっていることです。そのため、リンカーはこれらの関数への参照を見つけることができず、このエラーが発生します。

これで、mxe クロス コンパイラを使用して自分で gsl をコンパイルするか、共有ビルドを有効にすることができます (mxe ソース コードの src/gsl.mk を参照してください)。

自分のプロジェクトには gsl が必要なので、mxe へのプル リクエストで共有ビルドを有効にしようとしました ( https://github.com/mxe/mxe/pull/1568 )。この変更で運を試すことができましたが、うまくいきました。

于 2016-11-11T11:04:03.317 に答える
0

ディガノースするには、次のことをお勧めします

  1. 呼び出されている実際のコンパイラと呼び出されているフラグの完全な「ビルド ダンプ」を提供します。

  2. 完全なエラー ログを提供する

  3. 「objdump」などのバイナリ探索ツールを使用して (おそらく、「i686-pc-mingw32-objdump」などの MXE によってビルドされた mingw フォルダーの下にあります)、ビルドしたライブラリを調べて、不足しているシンボルが含まれているかどうかを確認します。 .

言い換えれば、`_gsl_matrix_alloc' 関数を内部に持つ必要があるライブラリを構築した場合は、構築したライブラリを見て、そこにあることを確認してください。どのライブラリにその関数を含める必要があるかわからない場合は、シェル作業を行って、そのシンボル名を探しているすべてのライブラリを検索します。

はい、ビルド システムを使用するたびに、最初にビルド システムについて多くのことを学ぶ必要がありますが、cmake や qmake などのビルド システムを使用すると作業が簡単になるでしょう。

最後に、最も役立つのは、自分のライブラリと同じライブラリを使用し、ウィンドウへのクロスコンパイルを知っている別のプログラムを見つけて、それらが行ったことをコピーすることです。そのようなプログラムの良い情報源は、mxe.cc にアクセスして、ウェブページの「mxe を使用するプロジェクト」リストを見て、それらのいずれかが GSL を使用しているかどうかを確認し、それをどのように行ったかを確認することです。プロジェクトを見つけるもう 1 つの方法は、GSL を使用しているオープン ソース プロジェクトを探し、メインの Web ページで Windows バイナリのダウンロードを宣伝しているかどうかを確認することです。もしそうなら、クロスコンパイルを使用している可能性があります。

幸運を!

于 2014-03-16T20:56:35.710 に答える