读取相对于包含文件的文件

时间:2011-07-09 19:25:59

标签: c++

我需要从放在我的库文件旁边的文件中加载一些文本(着色器代码)。这样,我可以在几个项目中#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不会受伤。

2 个答案:

答案 0 :(得分:1)

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

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

生成包含

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

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

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

另一方面,如果用户需要更改该文件而不重新编译程序,则外部文件是唯一的选项,但如何找到它所在的目录是高度依赖于系统的。例如,只考虑在某些系统上删除当前正在执行的程序的文件是完全可能的......在这种情况下,程序当前所在的任何磁盘上都没有目录。

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

答案 1 :(得分:0)

为什么不将此信息放在项目的配置文件中?这样它就可以轻松安装在任何机器上。