2016-10-14 16 views
0

externalProject_addコマンドを使用して、glfmプロジェクト全体をgithubから直接取得します。このチェックアウトの一環として、gitによって2つのファイルが検索されます。これらの2つのファイル(glad.cとglad.h)は、私のプロジェクトのソース依存として追加する必要があります。CMake externalProject_addで取得したファイルへの依存関係の処理方法

不幸にも、CMakeは生成中にこれらのファイルが不足していることを遵守します。これは、後でビルド時にダウンロードされるため正しいです。

エラーメッセージ:

CMake Error at CMakeLists.txt:79 (add_executable): 
    Cannot find source file: 

H:/Documents/Visual Studio 2013/Projects/BuildCMakeExternalOpenGL/glfw -prefix/src/glfw/deps/glad/glad.h 

Tried extensions .c .C .c++ .cc .cpp .cxx .m .M .mm .h .hh .h++ .hm .hpp 
.hxx .in .txx 


CMake Error: CMake can not determine linker language for target: CMakeExternalTemplate 
Generating done 

どのように私はこの問題を解決することができますか?

私のcmakeのファイル:

cmake_minimum_required(VERSION 2.8.4) 
project(CMakeExternalTemplate) 

include(ExternalProject) 

set(EXTERNAL_LIB_DIR ${PROJECT_BINARY_DIR}/libs) 

#CMakeExternalTemplate 
# -- Vars 
set(CMakeExternalTemplate_SOURCE_FILES main.cpp) 
set(CMakeExternalTemplate_INCLUDE_DIRS) 

# -- GLM 
set(glm_INSTALL_DIR ${EXTERNAL_LIB_DIR}/glm) 
externalProject_add(glm 
    GIT_REPOSITORY https://github.com/g-truc/glm.git 
    GIT_TAG 0.9.8.1 
    CMAKE_ARGS "-DCMAKE_INSTALL_PREFIX=${glm_INSTALL_DIR}") 
ExternalProject_Get_Property(glm source_dir) 
set(GLM_SRC_DIR ${source_dir}) 

#GLFW 
# -- Vars 
set(glfw_INSTALL_DIR ${EXTERNAL_LIB_DIR}/glfw) 
set(glfw_INCLUDE_DIRS ${glfw_INSTALL_DIR}/include) 

externalProject_add(glfw 
    GIT_REPOSITORY https://github.com/glfw/glfw.git 
    GIT_TAG 3.2.1 
    CMAKE_ARGS "-DCMAKE_INSTALL_PREFIX=${glfw_INSTALL_DIR}") 

ExternalProject_Get_Property(glfw source_dir) 
set(GLFW_SRC_DIR ${source_dir}) 

#Glad 
set(GLAD "${GLFW_SRC_DIR}/deps/glad/glad.h" 
     "${GLFW_SRC_DIR}/deps/glad.c") 

include_directories(${GLM_SRC_DIR}) 
include_directories(${glfw_INCLUDE_DIRS} ${GLFW_SRC_DIR}/deps) 

# -- -- CMakeExternalTemplate 
include_directories(${CMakeExternalTemplate_INCLUDE_DIRS}) 

# -- Compile 
add_executable(${PROJECT_NAME} ${CMakeExternalTemplate_SOURCE_FILES} ${GLAD}) 

答えて

0

外部プロジェクトがそのように使用されるものではありません。コンパイルのターゲットを作成します。

これらのライブラリをダウンロードしてビルドするので、ソースファイルを含める必要はありません。

あなたがする必要があるのは、作成したライブラリ(target_link_librarylink_directoriesを参照)とのリンクです。glad.cの結果が必要な場合は、おそらくそのオブジェクトファイルとリンクできます。

add_dependency(${PROJECT_NAME} glfw glm) 

が何らかの理由であなたが明示的にそこにソースファイルが必要な場合は前に、これらのライブラリのダウンロードとコンパイルを成し遂げることを確認しますので、けれどもあなたはまた、手動で依存関係を追加する必要があります

External_projectは使用できません。 execute_process(git clone ...)と必要な他のコマンドを使用してcmakeの設定中に手動で行う必要があります。

+0

2つの必要なファイルはglfwの依存関係です。残念ながら、glfwとまったく同じバージョンをリンク互換にする必要があります。あなたは 'execute_process'を使う必要があるかもしれませんが、もっと簡単な方法があることを願っています。 –

+0

@BerndL。 afaikにはこのためのフレームワークはありません。結果のオブジェクトファイルをバイナリにリンクするだけではありませんか?ヘッダーは決して必要ないはずです。あなたはあなたのファイルの1つに "インクルード"を追加するだけで、それがコンパイルされます。あなたが "ハッキー"に行きたいのであれば、Cファイルをソースコードに含めることもできますが、オブジェクトのリンクはもっときれいになると思います。 – Hayt

+0

問題は、実行可能ファイルにglad.cを追加する必要があるということです。しかし、このglad.cファイルが最初のビルド中に取得されると、遅くなります。 –

0

あなたが探しているものは、CMake superbuildアプローチです。 Superbuildは、CMakeを実行する2つのネストされたレイヤーを持つように、最初のレイヤーは外部プロジェクトをプルダウンし、必要に応じてコンパイルします。

それから、それは別の外部プロジェクトとして呼び出され、ダウンロードされた外部ディレクトリを渡し、あなたが望むようにプロジェクト定義でこれらを使用することができます。これはちょっと面倒ですが、実際にはIDEのすべてを自動的に自動生成するわけではありません。

cmake superbuildテンプレートをgithub/googleで検索して試してみてください。理想的ではありませんが、開発環境とCI環境で一貫したビルドを得ることができます。

関連する問題