2017-10-24 2 views
0

私のプロジェクトのgitサブモジュールとしてxgboostライブラリを追加しました。サブディレクトリとしてcmakeに追加しようとしています。残念ながら、それは動作していません。以下のCMakeLists.txtを持つ単純なhello worldプロジェクトは、私が得ているエラーを再現します。CMakeサブディレクトリとして追加したときにライブラリを構築しない

cmake_minimum_required(VERSION 3.2) 
project(foo) 
add_subdirectory(xgboost) 
add_executable(${PROJECT_NAME} foo.cpp) 
target_link_libraries(${PROJECT_NAME} xgboost) 

は、ライブラリを構築した後ので、私は次のエラーを取得するxgboost/libにディレクトリには何もありません。

clang: error: no such file or directory: 
'/Users/.../myproject/xgboost/lib/libxgboost.dylib' 

CMakeListsファイルには2つの異なるターゲットがあるため、問題が発生していると思います。多分cmakeは間違ったターゲットを選んでいるが、私はそれを理解するためにcmakeに十分に精通していない。次のコードはxgboostのCMakeListsのコードです。重要度の順に

# Executable 
    add_executable(runxgboost $<TARGET_OBJECTS:objxgboost> src/cli_main.cc) 
    set_target_properties(runxgboost PROPERTIES 
    OUTPUT_NAME xgboost 
) 
    set_output_directory(runxgboost ${PROJECT_SOURCE_DIR}) 
    target_link_libraries(runxgboost ${LINK_LIBRARIES}) 

    # Shared library 
    add_library(xgboost SHARED $<TARGET_OBJECTS:objxgboost>) 
    target_link_libraries(xgboost ${LINK_LIBRARIES}) 
    set_output_directory(xgboost ${PROJECT_SOURCE_DIR}/lib) 

    #Ensure these two targets do not build simultaneously, as they produce outputs with conflicting names 
    add_dependencies(xgboost runxgboost) 

私の質問は以下のとおりです。

  1. はxgboostのCMakeLists.txtファイルを変更することなく、それを修正する方法はありますか?
  2. 私のプロジェクトにgitサブモジュールとしてxgboostを追加するのは妥当ですか?
  3. cmakeがライブラリのビルドを指示していない理由はありますか?

注:問題を絞り込んで詳細を提供しようとしたので、この質問にいくつかの編集がありました。

+0

私のCMakeListsファイルの関連部分が欠落していると思ったら、私に教えてください。 – German

+1

奇妙なことに、 'target_link_libraries'で** target **を使うとき、CMakeはどこの場所でもライブラリファイルを見つけるはずです。ライブラリを見つけられないという正確なエラーメッセージを提供できますか? – Tsyvarev

+0

@Tsyvarev質問にエラーを追加しました。 – German

答えて

1

(私はコメント欄にあらかじめいくつかのことをお願いするのが大好きだが、私はこれを行うには低すぎる評判を持っているので、私はそれに打撃を与える;))

私はいくつかの容疑者を持っている、とそれらの1つはサブモジュールのルートCMakeLists.txt${CMAKE_SOURCE_DIR}です。 CMakeLists.txtだけを実行するとパスが正しく設定されますが、cmakeはサブディレクトリとして追加すると混乱します。出力バイナリの別のディレクトリを調べましたか?

最初に私はこの仮説を試してみることをお勧めしたいと思いますが、同様の書き込みをお勧めしますが、xgboostライブラリのファイルを別にCMakeLists.txtに分けてプロジェクトで一時的に置き換えてください。残念ながら、CMakeLists.txtファイル名はハードコードされており、1つのディレクトリに2種類のファイルがある可能性はありません。だから、への答えが1)であることは、ファイルを変更する必要があるということです。

の場合2)CMakeLists.txtに巨大なロジックを追加する必要がない限り、意味があります。その他の実行可能なオプションはinstallターゲットを作成して、xgboostライブラリをローカルにインストールし((doc)変数を使用して)、インストールパスをCMAKE_LIBRARY_PATHdoc)に追加することができます。

+0

残念ながら、それは理由ではないようです。質問に役立つかどうか調べるために追加情報を追加しています。 – German

+0

私は非常に最小限の例で質問を更新しました。 – German

関連する問題