我假设您正在谈论让正在构建您的项目的其他开发人员可以使用“着色器”文件夹,因为如果您指的是最终用户(这将涉及install
组件),那么您就不会谈论构建文件夹。
我认为在运行时为着色器文件夹提供固定位置的最简单方法是将其从源代码树复制到构建树。通过这种方式,其他开发人员可以将他们的根构建文件夹放置在您项目之外的任何位置(如果他们愿意,甚至可以放置在内部),并且应用程序在访问复制的着色器文件夹时仍然有一个固定的相对路径来处理。
如果您不想复制,还有其他选项(例如,您可以让 CMake 将配置文件写入构建树;配置文件可以指定着色器文件夹的路径)但我认为它们更复杂并且可能更脆弱。无论如何,我认为关键是在配置时(当 CMake 执行时)将信息从源树复制到构建树,以便运行时代码不涉及对可能非常遥远的源树的困难搜索。
一个示例根 CMakeLists.txt 将是:
cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
project(example)
add_executable(GraphicsApp GraphicsApp/main.cpp)
add_library(GraphicsLib
GraphicsLib/library/fileA.cpp
GraphicsLib/library/fileB.cpp
GraphicsLib/include/fileA.h
GraphicsLib/include/fileB.h
GraphicsLib/shaders/shader1.txt
GraphicsLib/shaders/shader2.txt
)
include_directories(GraphicsLib/include)
target_link_libraries(GraphicsApp GraphicsLib)
add_custom_command(TARGET GraphicsApp POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_directory
${CMAKE_SOURCE_DIR}/GraphicsLib/shaders
$<TARGET_FILE_DIR:GraphicsApp>/shaders)
为了扩展add_custom_command
调用,这基本上会导致“着色器”子目录被复制到GraphicsApp
将被构建到的文件夹中。该命令在GraphicsApp
构建时执行。如果GraphicsApp
已构建并且是最新的并且您尝试重新构建它,则自定义命令将不会执行。
自定义命令实际执行
cmake -E copy_directory <path to shaders source> <path to shaders copy>
利用 CMake 的-E
跨平台命令模式。
命令的“目标”部分(“复制到”位置)使用生成器表达式来推断GraphicsApp
将构建到的位置:$<TARGET_FILE_DIR:GraphicsApp>
。这可能是实现这一目标的最稳健的方式;无论配置类型如何,它都是正确的(例如,MSVC 在构建路径中插入“Debug/”或“Release/”文件夹)。
因此,这有望使您实现目标。我想您仍然必须获取正在运行的 exe的完整路径,然后才能推断出复制的着色器文件夹的完整路径。但是,这应该比从当前工作目录中搜索更简单、更健壮。即使计算当前的工作目录也很重要。