所以我遇到了一个问题,我需要使用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 /编译器在编译后将某个目录中的文件复制到程序构建目录(编译后的二进制文件所在的位置)?(并且有它)只有当文件不存在时才会这样做。)
谢谢!
答案 0 :(得分:0)
我最近遇到了this article,这可能对你有帮助。
以下是我的一些建议:
您可以安全地使用较新版本的CMake。目前,它是3.11。坚持旧版本毫无意义。
考虑在变量中列出所有来源(使用set
command),而不是使用file(GLOB)
。生成构建文件时,file(GLOB)
只会被评估一次。如果你添加新的源代码,你必须手动重新生成它,所以它没有太多帮助,并且更难调试(实际上,调试更复杂的CMake项目可能会很痛苦)。
避免使用include_directories
(和link_libraries
)。首选使用每个目标有效的target_include_directories
。它允许表达目标之间的依赖关系(当你有多个目标时 - 这可能会随着项目的增长而发生)
您可以考虑使用find_package(GLFW)
,而不是在项目中包含GLFW。 编辑:实际上,CMake并未附带GLFW的查找模块,但您可以使用外部模块(例如this one),如here所述。
修改强>
下面的示例说明了第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.我记得过去曾经找过类似的东西,最近才发现它。)