我正在使用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})
答案 0 :(得分:0)
外部项目不应该以这种方式使用。它创建了编译目标。
它将下载这些库并构建它们,因此不需要包含它们的源文件。
您应该做的是链接他们创建的库(请参阅target_link_library
和link_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环境中获得了一致的构建。