2017-01-05 9 views
0

cmakeを使用して定義された共有ライブラリがあります。ライブラリの一部は、ライブラリのユーザによって実装される必要がある機能を呼び出す。リンクエラーがMingW32でクロスコンパイルされ、Linuxではなく

Linuxでコンパイルすると、正常に動作します。私がCygwinの下でMingWを使ってクロスコンパイルすると、上で説明した関数と依存ライブラリの関数でリンクエラーが発生します。

私のCMakeLists.txtは例えば、ライブラリの "add_library" と "target_include_directories" のキーワードを指定:

add_library(my_library SHARED my_lib_1.c my_lib_2.c) 
target_include_directories(my_library PUBLIC /usr/local/include PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/inc) 

なぜそれがLinuxやCygwinのない/ MinGWの上で[OK]をコンパイルするのですか?

Cygwin/MingWでコンパイルするにはどうしたらいいですか?

多くのありがとうございます。

答えて

0

http://edll.sourceforge.net/は言う:多くの人が知っているかもしれませんが

、DLLは1つの制限があります:彼らは 一つでも未定義シンボルを持つことはできません。これは、DLLを作成するときに、 を何らかの方法で解決されたオブジェクトファイルのすべての未定義の シンボルを取得するために、他のDLLとリンクする必要があることを意味します。それは未定義のシンボルとDLLをアプリケーション(EXE)にリンクしませんデフォルトで を持つことができないので、これはあまりうまく機能しませんDLLで

... ...。

また、別の言い方をすると、「Windowsは不十分で、設計が不適切で、一般的にはゴミだから、まったく何の努力もせずに半分しかできません」。

の上に自分の質問に答えるために:Linuxは、未定義のシンボルの耐性があるので

1)共有ライブラリは、Linux上で作品をコンパイルします。 Linux/GCCがリンク時にシンボルを必要としない場合(共有ライブラリを作成しているため)、実際にはリンクしていない場合(DLLを作成するためにリンクする必要がありますが、共有ライブラリは作成しないでください)それは1つを要求しない。 Windowsではデザインとアーキテクチャが悪いため、最終リンク時(つまり実行ファイルをリンクするとき)にすべてのシンボルを満たすのではなく、DLLを作成するときにすべてのシンボルをリンクする必要があり、共有ライブラリのコンパイルが失敗します。

2a)解決方法は、cmakeでMingWコンパイルを検出し、共有ライブラリユーザーのインポートライブラリを生成し、共有ライブラリをそのほかのすべての依存関係にリンクすることです。欠点は、スタンドアロンエンティティとしてライブラリを配布したい場合、これはかなりの文書化を必要とすることです。

2b)2番目の解決方法は、この問題を回避するために共有ライブラリを再構築することです。個人的には、オペレーティングシステムの不備を回避するために、私の既存のきちんとした細い線のデザインを壊すのは嫌です。私は、その一般的な無能さに関して、ファシストの利益を惜しみません。

関連する問題