wil*_*amg 4 cmake organization include-path
我正在为OpenGL构建一个非常轻量级的库/包装器,我遇到了一个小问题.假设我有一个看起来像这样的目录结构:
GraphicsProject
|GraphicsApp
||main.cpp
|GraphicsLib
||include
|||fileA.h
|||fileB.h
||library
|||fileA.cpp
|||fileB.cpp
||shaders
|||shader1.txt
|||shader2.txt
|| build
||| bunch of build stuff
Run Code Online (Sandbox Code Playgroud)
在运行时获取shader1.txt路径的最佳方法是什么?或者,不管是谁在使用这个项目或者它在用户机器上的位置,都要使路径不会改变?
我考虑过的一些选项:1)获取当前的工作目录并使用该路径直到我需要的位置.我对此解决方案的主要关注是,我不确定当前目录将根据用户构建项目的方式或其他因素而无法控制.它也感觉不是很优雅.2)将着色器的源代码存储为char数组/字符串,位于include目录中的.h文件中.这似乎是一个更好的解决方案,除了它会使着色器编写稍微麻烦.
有这样做的标准方法吗?我正在使用CMake构建项目,如果这改变了什么.
我假设您正在谈论将"着色器"文件夹提供给正在构建项目的其他开发人员,因为如果您的意思是最终用户(这将涉及install组件),您将不会谈论构建文件夹.
我认为在运行时为shaders文件夹提供固定位置的最简单方法是将其从源树复制到构建树.通过这种方式,其他开发人员可以将他们的根构建文件夹放置在项目之外的任何位置(如果他们想要,甚至可以放在内部),并且应用程序在访问复制的着色器文件夹时仍然只有一个固定的相对路径来处理.
还有是在情况下,其他选项,你不想复制(例如,你可以有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)
Run Code Online (Sandbox Code Playgroud)
要在add_custom_command调用上稍微扩展一点,这基本上会导致"shaders"子目录被复制到GraphicsApp将要构建的文件夹中.任何时候GraphicsApp都会执行该命令.如果GraphicsApp构建并且是最新的并且您尝试重建它,则不会执行自定义命令.
自定义命令实际执行
cmake -E copy_directory <path to shaders source> <path to shaders copy>
Run Code Online (Sandbox Code Playgroud)
利用CMake的-E跨平台命令模式.
命令的"目标"部分("复制到"位置)使用生成器表达式来推断GraphicsApp将构建的位置:$<TARGET_FILE_DIR:GraphicsApp>.这可能是实现这一目标最有力的方式; 无论配置类型如何,它都是正确的(例如,MSVC在构建路径中插入"Debug /"或"Release /"文件夹).
所以这有希望让你最大程度地实现你的目标.我想你仍然需要获得正在运行的exe的完整路径,然后推断出复制的着色器文件夹的完整路径.但是,与从当前工作目录中搜索相比,这应该更加简单和健壮.即使计算当前的工作目录也是非常重要的.
| 归档时间: |
|
| 查看次数: |
2417 次 |
| 最近记录: |