CMake如何处理通过externalProject_add

时间:2016-10-14 11:17:46

标签: git cmake glfw

我正在使用externalProject_add命令直接从github中检索整个glfm项目。作为此结帐的一部分,将通过git检索两个文件。这两个文件(glad.c和glad.h)将需要添加为我项目的源依赖项。

不幸的是,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})

2 个答案:

答案 0 :(得分:0)

外部项目不应该以这种方式使用。它创建了编译目标。

它将下载这些库并构建它们,因此不需要包含它们的源文件。

您应该做的是链接他们创建的库(请参阅target_link_librarylink_directories。)如果您只需要glad.c的结果,您可能可以链接到目标文件它的。

您还需要添加手动依赖项,以确保在

之前完成这些库的下载和编译。
add_dependency(${PROJECT_NAME} glfw glm)

如果由于某种原因您需要明确存在源文件,则无法使用External_project。您必须在使用execute_process(git clone ... )的cmake配置和您需要的其他命令时手动执行此操作。

答案 1 :(得分:0)

您正在寻找的是CMake superbuild方法。 Superbuild将进行设置,以便您有两个嵌套的CMake层执行 - 第一层将下拉外部项目,可选择在需要时编译它们。

然后,它将自己称为另一个外部项目,传递下载的外部目录,然后您可以根据需要在项目定义中使用它们。它有点麻烦,实际上并没有为你自动填充IDE中的所有内容。

在github / google上搜索cmake superbuild模板并试用它们 - 它并不理想,但你确实在开发和CI环境中获得了一致的构建。