2016-10-14 8 views
0

내가 GitHub의에서 직접 전체 glfm 프로젝트를 가져 오지하기 위해 externalProject_add 명령을 사용하고 있습니다 통해 검색 파일에 dpendencies을 처리한다. 이 체크 아웃의 일환으로 두 파일은 git을 통해 검색됩니다. 이 두 파일 (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

두 개의 필요한 파일은 glfw의 종속성입니다. 불행하게도 glfw와 똑같은 버전을 사용해야 링크 호환이 가능합니다. 당신은'execute_process'를 사용할 필요가 있을지 모르겠지만 더 쉬운 방법이 있기를 희망합니다. –

+0

@BerndL. afaik에는 이에 대한 프레임 워크가 없습니다. 바이너리의 결과 객체 파일에 링크 만 할 수 있습니까? 헤더가 필요하지 않아야한다는 뜻입니다. 파일 중 하나에 "include"를 추가하면 컴파일됩니다. "해킹"을하고 싶다면 C 파일을 소스 코드에 포함 시키면 좋겠지 만 객체 연결은 더 깨끗해질 것이라고 생각합니다. – Hayt

+0

문제는 링크 할 수 있도록 실행 파일에 glad.c를 추가해야한다는 것입니다. 그러나이 glad.c 파일을 처음 빌드하는 동안 검색하면 늦어집니다. –

0

은 CMake의 superbuild 접근 방식이다. Superbuild는 CMake 실행의 두 개의 중첩 된 레이어를 가질 수 있도록 일을 설정합니다. 첫 번째 레이어는 외부 프로젝트를 풀다가 필요할 경우 컴파일합니다.

그리고, 그것은 또 다른 externalproject로 자신을 호출 다운로드 외부 디렉토리를 따라 통과하고 당신이 원하는대로 당신은 프로젝트 정의에서 다음을 사용할 수 있습니다. 조금 성가기는하지만 실제로 IDE에서 모든 것을 자동으로 채우지는 않습니다.

검색 GitHub의/cmake superbuild 템플릿 구글 그들을 밖으로 시도 - 그것은 이상적인 건 아니지만, 당신은 일관성을받을 수 있나요 개발 및 CI 환경에서 구축합니다.