我目前在制作" fromAssets"提供程序执行的资产文件夹路径的函数。
该功能来自以下代码部分。
标题文件:
#include <iostream>
#include <boost/filesystem.hpp>
namespace fs = boost::filesystem;
namespace path {
static fs::path BUILD_PATH;
const void initialiseBuildPath(const char *argv);
const char * fromAssets(const char * path);
}
源文件:
using namespace path;
const void path::initialiseBuildPath(const char *argv0) {
BUILD_PATH = fs::initial_path<fs::path>();
BUILD_PATH = fs::system_complete(fs::path(argv0))
.parent_path()
.parent_path();
}
const char * path::fromAssets(const char * path) {
std::string strPath = std::string(path);
return (BUILD_PATH.string() + "/assets/" + strPath).c_str();
}
使用:
const char * absolute = "/Users/thomaspetillot/CLionProjects/glDiscoverProject/build/assets/shader/basic.vert.glsl";
const char * generated = path::fromAssets("shader/basic.vert.glsl");
cout << strcmp(absolute, generated) << endl; // show 0
// Work
auto * shader = new Shader(absolute,
path::fromAssets("shader/basic.frag.glsl"));
// Doesn't work
auto * shader = new Shader(generated,
path::fromAssets("shader/basic.frag.glsl"));
文件夹结构:
build
├── assets
│ ├── img
│ │ ├── pepe.jpg
│ │ └── snoop.jpg
│ └── shader
│ ├── basic.frag.glsl
│ └── basic.vert.glsl
└── bin
└── program
如何为frag着色器而不是为另一个着色器工作?
答案 0 :(得分:1)
fromAssets
方法返回指向无效内存地址的指针。这是因为您返回std :: string对象的c_str()
指针,该对象是该函数的局部变量。当函数返回时,所有局部变量(包括std :: string)都被删除,返回的指针指向不再存在的内存地址。
最好(也是最现代的)修复方法是返回std :: string对象本身而不是const char *指针。您可以将c_str指针传递给Shader构造函数,或者甚至更好地调整构造函数以将const std::string&
作为参数。