如何改进我的脚本并在构建时复制程序资源?

时间:2018-06-02 18:22:13

标签: c++ cmake copy resources

所以我遇到了一个问题,我需要使用linux一段时间而不是windows,并认为linux没有Visual Studio。然后我也意识到我只创建了我的Visual Studio项目,这是我不想要的。

所以我查阅了一些CMake教程并尝试创建一些可以在Visual Studio和CodeBlocks中加载的示例。当我开始工作时,我通过拼凑我学到的东西和教程中的内容,为我的实际程序编写了一个CMake脚本。 见这里:

cmake_minimum_required(VERSION 2.8.9)

add_subdirectory(libraries/glfw)

project (OpenGLEngine3D)

include_directories(libraries/glfw/include)
include_directories(libraries/glm)
include_directories(libraries/glad/include)
include_directories(libraries/whereami/src)
include_directories(libraries/stb)

file(GLOB SOURCES "src/*.cpp" "src/*.h" "libraries/whereami/src/whereami.c" "libraries/glad/src/glad.c")

add_executable(OpenGLEngine3D  ${SOURCES})
target_link_libraries(OpenGLEngine3D glfw)

它很脏(我认为)但它有效。 那么现在我的第一个问题是,如何改进我的CMake脚本?什么是多余的或以糟糕的方式完成?

现在我的程序还需要一些资源(比如着色器,纹理),这些资源与我的CMake脚本,库和c ++文件一起存储在目录中。 所以我的第二个问题是,我怎么告诉CMake将ide /编译器在编译后将某个目录中的文件复制到程序构建目录(编译后的二进制文件所在的位置)?(并且有它)只有当文件不存在时才会这样做。)

谢谢!

1 个答案:

答案 0 :(得分:0)

我最近遇到了this article,这可能对你有帮助。

以下是我的一些建议:

  1. 您可以安全地使用较新版本的CMake。目前,它是3.11。坚持旧版本毫无意义。

  2. 考虑在变量中列出所有来源(使用set command),而不是使用file(GLOB)。生成构建文件时,file(GLOB)只会被评估一次。如果你添加新的源代码,你必须手动重新生成它,所以它没有太多帮助,并且更难调试(实际上,调试更复杂的CMake项目可能会很痛苦)。

    < / LI>
  3. 避免使用include_directories(和link_libraries)。首选使用每个目标有效的target_include_directories。它允许表达目标之间的依赖关系(当你有多个目标时 - 这可能会随着项目的增长而发生)

  4. 您可以考虑使用find_package(GLFW),而不是在项目中包含GLFW。 编辑:实际上,CMake并未附带GLFW的查找模块,但您可以使用外部模块(例如this one),如here所述。

  5. 修改

    下面的示例说明了第2点背后的想法,假设源位于与CMakeLists.txt文件相同的“src /”目录中:

    set(engine_sources
        "src/header_1.hpp"
        "src/source_1.cpp"
        # and so on for reset of files...
    )
    
    add_executable(OpenGLEngine3D ${engine_sources})
    

    关于第二个问题:那就是file(COPY) command的用途。或者,您可以将资源保留在源目录中,并在IDE中设置工作目录。

    附注:如果您选择第二个选项,则可以通过设置VS_DEBUGGER_WORKING_DIRECTORY属性,从CMake for Visual Studio设置此选项:

    set_target_properties(OpenGLEngine3D PROPERTIES VS_DEBUGGER_WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
    

    (我没有检查过它是否按预期工作,因为我很少使用VS.我记得过去曾经找过类似的东西,最近才发现它。)