2013-06-07 9 views
6

私はcmakeからGenerateExportHeaderモジュールを使用しようとしています。cmakeとGenerateExportHeader

私CmakeLists.txtの一部:

add_compiler_export_flags() 
add_library(gui SHARED ${gui_CPP} ${gui_HPP}) 
generate_export_header(gui) 

それはGUIプロジェクト自体のための素晴らしい作品が、私は別のプロジェクト、の#include「gui_export.h」のGUIの.hファイルを含めるしようとすることはできません見つける。 他のプロジェクトのインクルードパスにないguiのビルドディレクトリにgui_export.hが作成されているので、これは明らかです。簡単な解決策は、他のプロジェクトのためのGUIのビルドディレクトリを追加することです

はなく、含まれています: 1.私は、私が実際にしてもビルドが何であるかを見つける方法を見つけることができませんでしたコーシャソリューション 2としてそれを見つけることができません。ターゲットのディレクトリ

どうすればこの問題をうまく解決できますか?

+0

hm、あなたは2つのプロジェクト/ DLLをターゲットリンクせず、別のプロジェクトであなたのGUIファイルのヘッダー宣言を使用していますか? – Najzero

+0

私はそれらをリンクします。それは何が変わるのですか? –

答えて

5

(すなわち2.8を包含し、$ {CMAKE_BINARY_DIR} /エクスポートを追加/すべてのプロジェクトで0.11以降)にCMake、好ましいメカニズムは次のとおりです。次に

target_include_directories(gui PUBLIC ${CMAKE_BINARY_DIR}/exports) 

とき輸出()ライブラリ(あなたが行う必要があります)、またはそれ以外の場合は、ターゲット・インタフェースのプロパティのコンテキストでそれを使用! (例えば、あなたがやっているようなCMakeプロジェクト全体で)、target_link_libraries(foo gui)も必要なインクルードディレクトリを取得します。

よく知られているディレクトリに置くことはやや直交しています。どちらの場合も、target_include_directoriesを使用して、ライブラリのヘッダをどこに見つけるかを消費者に伝えることをお勧めします。

-2

export()を使用すると、CMakeはビルドツリーを見つけることができます。 config.cmakeファイルがどのように見えるかを見るために、openobexをgitoriousで見てみることができます。

OTOHの場合は、生成されたエクスポートヘッダーをパブリックヘッダーに使用するか、インストールしないでください。

+1

輸出のヘッダーを公開しないというあなたのアドバイスは興味深いように聞こえますが、私はその考えを理解しません。 私は、クラスAを持つ単一のcppファイルを持つライブラリがあるとしましょう。 私はウィンドウの下にビルドするときに、このクラスをエクスポートするように指示する必要があります。 私が知る限り、これは通常、__declspec(dllexport)を使ってクラスAの定義で.hファイルを準備することによって行われます。 反対側から、私はこのクラスをどこか別の場所で使いたいときは、__declspec(dllimport)を使うべきです。これは、generate_export_headerの機能です。このエクスポートファイルを公開せずにどのようにしたらよいですか? –

+0

それは意味をなさない。エクスポートヘッダーは、ライブラリのコンシューマとライブラリ自体で使用されることを意味します*。 – Matthew

+2

ヘッダーをエクスポートする必要があります。彼らはそれの周りにはありません。あなたのインストールターゲットでは、あなたはそれをコピーし、それはあなたの他のヘッダーに含まれています。 – Atifm

4

私は今、私が持っている、EXPORT_FILE_NAMEを使用することによって、この問題を解決しました:

generate_export_header(gui EXPORT_FILE_NAME ${CMAKE_BINARY_DIR}/exports/gui_export.h) 

と私は現代では