gpt4 book ai didi

c++ - 读取相对于包含文件的文件

转载 作者:行者123 更新时间:2023-11-28 08:19:00 25 4
gpt4 key购买 nike

我需要从库文件旁边的文件中加载一些文本(着色器代码)。这样,我可以在多个项目中#include TextureBloomer.h,TextureBloomer 将负责加载其着色器,而无需通过配置或环境变量设置路径。目录层次结构如下所示:

libs/libName/src/TextureBloomer/TextureBloomer.{h,cpp}
libs/libName/src/TextureBloomer/shaders/shader_name.{frag,vert}
apps/mine/appName/src/[several .h files that #include "TextureBloomer/TextureBloomer.h"]

我一直在寻找方法来做到这一点,但我只找到了一些帖子说“你不能”,或者“你为什么要这么做?”我找到了一个适合我的(hacky)解决方案,但我看到其他帖子说使用 __FILE__ 是不好的 juju(没有理由)。所以,问题是 a) 这有什么不好的,b) 有没有办法改进它,例如。所以我不必在源文件中包含“TextureBloomer.cpp”以防我更改它的名称。

string filename ("shaders/shader_name.frag");
string currentFile (__FILE__);
currentFile.replace(currentFile.find("TextureBloomer.cpp"), 18, "");
file.open((currentFile + filename).c_str());

编辑:

我在 OSX 上,使用 XCode 进行编译。我真的只需要它在那里工作,但其他 *nixes 不会受到伤害。

最佳答案

您将该文件用作您程序的某种“资源”。在这些情况下,一个简单的选择是自动生成一个 .cpp 模块,其中包含您需要的源代码作为字符串文字......例如,如果您的源代码是

void foo(int x, int y)
{
return x + y;
}

你生成一个包含

const char *shader_src[] = {
"void foo(int x, int y)",
"{",
" return x + y;",
"}",
NULL };

这一代只需要几行 Python 代码,并且可以添加到您的项目 makefile 中,以便在原始源代码发生任何更改时自动重新生成文件。

这样做你最终会得到一个内部包含这个资源的可执行文件,不需要分发外部文件。

另一方面,如果您需要用户在不重新编译程序的情况下更改该文件,那么外部文件是唯一的选择,但是如何找到它所在的目录在很大程度上取决于系统。举个例子,在某些系统上,完全有可能删除当前正在执行的程序的文件……在这种情况下,程序当前所在的任何磁盘上都没有目录。

C++ 之所以无法在运行时可移植地访问源代码目录,是因为 C++ 语言即使在哲学层面上也明确区分了“编译时”和“运行时”两个阶段。

关于c++ - 读取相对于包含文件的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6636981/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com