Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cmake 如何在C++;图书馆_Cmake_Organization_Include Path - Fatal编程技术网

Cmake 如何在C++;图书馆

Cmake 如何在C++;图书馆,cmake,organization,include-path,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 stuf

我正在为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
运行时获取shader1.txt路径的最佳方法是什么?或者,无论是谁在使用此项目或它位于用户机器上的何处,都要确保路径不会更改

我考虑过的一些选择: 1) 获取当前的工作目录,并使用该路径来工作到需要的位置。我对这个解决方案的主要担忧是,我不确定当前目录会根据用户构建项目的方式或我无法控制的其他因素发生多少变化。感觉也不是很优雅。 2) 将着色器的源代码作为字符数组/字符串存储在include目录中的.h文件中。这似乎是一个更好的解决方案,只是它会使着色器的编写稍微麻烦一些


有没有一个标准的方法可以做到这一点?我正在使用CMake来构建项目,如果这有什么改变的话。

我假设你说的是让其他开发人员可以使用“着色器”文件夹来构建你的项目,因为如果你指的是最终用户(包括
安装组件),你就不会谈论构建文件夹

我认为在运行时为着色器文件夹提供固定位置的最简单方法是将其从源树复制到构建树。通过这种方式,其他开发人员可以将其根构建文件夹放在项目外部的任何位置(如果他们愿意,甚至可以放在项目内部),并且在访问复制的着色器文件夹时,应用程序仍将有一个固定的相对路径来处理

如果您不想复制,还有其他选项(例如,您可以让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)
利用CMake的跨平台指挥模式

命令的“目的地”部分(“复制到”位置)使用生成器表达式来推断
GraphicsApp
将构建到的位置:
$
。这可能是实现这一目标最有力的方式;无论配置类型如何,它都是正确的(例如,MSVC将“Debug/”或“Release/”文件夹插入构建路径)


因此,希望这能让你实现你的目标。我想您仍然需要推断复制的着色器文件夹的完整路径。但是,这应该比从当前工作目录中搜索要简单和健壮得多。甚至是非常重要的。

作为生成后命令将着色器文件复制到生成树中是否可行?可能……但我需要您解释这意味着什么以及我将如何使用它。谢谢,自定义命令帮助了我。我想知道为什么要将shader1.txt和shader2.txt添加为库?它们不必添加到包含
GraphicsLib
的文件列表中(实际上,.h文件也不必添加),但由于添加了它们,它们在某些IDE中显示为属于该库(例如Visual Studio和Xcode)。如果我需要将库的定义放在一个单独的文件中(我会使用add_子目录添加库),该怎么办?我应该将add_custom_命令放在可执行文件或库的CMake文件中吗?
cmake -E copy_directory <path to shaders source> <path to shaders copy>