gpt4 book ai didi

c++ - .exe 不会编译,但在 visual studio 中运行时会编译

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

只有当 .exe 文件说它试图使用文件读取器方法来查找我正在使用的着色器时,问题才会出现,但是当我在 visual studio 中运行它时,它工作正常。这是文件读取方法

    static std::string read_file(const char* filepath)
{
FILE* file = fopen(filepath, "rt");
fseek(file, 0, SEEK_END);
unsigned long length = ftell(file);
char* data = new char[length + 1];
memset(data, 0, length + 1);
fseek(file, 0, SEEK_SET);
fread(data, 1, length, file);
fclose(file);

std::string result(data);
delete[] data;
return result;
}

具体来说,它在调用它的行的 fseek(file, 0, SEEK_END) 部分中断了

shader = new Shader("basic.vert", "basic.frag");

文件位于与 .cpp 相同的文件夹和 .exe 文件夹中。着色器在这里定义

Shader::Shader(const char* vertexPath, const char* fragPath)
: m_VertexPath(vertexPath), m_FragPath(fragPath)
{
m_ShaderID = load();
}

GLuint Shader::load()
{
GLuint program = glCreateProgram();
GLuint vertex = glCreateShader(GL_VERTEX_SHADER);
GLuint fragment = glCreateShader(GL_FRAGMENT_SHADER);

std::string vertexSourceString = read_file(m_VertexPath).c_str();
std::string fragSourceString = read_file(m_FragPath).c_str();

const char* vertexSource = vertexSourceString.c_str();
const char* fragSource = fragSourceString.c_str();



glShaderSource(vertex, 1, &vertexSource, NULL);
glCompileShader(vertex);

GLint result;
glGetShaderiv(vertex, GL_COMPILE_STATUS, &result);
if (result == GL_FALSE)
{
GLint length;
glGetShaderiv(vertex, GL_INFO_LOG_LENGTH, &length);
std::vector<char> error(length);
glGetShaderInfoLog(vertex, length, &length, &error[0]);
std::cout << "Failed to compile vertex shader :(" << std::endl << &error[0] << std::endl;
glDeleteShader(vertex);
return 0;
}

glShaderSource(fragment, 1, &fragSource, NULL);
glCompileShader(fragment);


glGetShaderiv(fragment, GL_COMPILE_STATUS, &result);
if (result == GL_FALSE)
{
GLint length;
glGetShaderiv(fragment, GL_INFO_LOG_LENGTH, &length);
std::vector<char> error(length);
glGetShaderInfoLog(fragment, length, &length, &error[0]);
std::cout << "Failed to compile fragment shader :(" << std::endl << &error[0] << std::endl;
glDeleteShader(fragment);
return 0;
}

glAttachShader(program, vertex);
glAttachShader(program, fragment);

glLinkProgram(program);
glValidateProgram(program);

glDeleteShader(vertex);
glDeleteShader(fragment);

return program;
}

抱歉,如果这有点长,但我想说的很透彻,但我不确定是哪一点导致了问题。

最佳答案

您需要确保 basic.vertbasic.frag 文件与可执行文件位于同一目录中。或者,您需要在确定文件位置时指定绝对路径。或者,您需要将开发投入到“资源加载器”类型的对象中,该对象将动态查询外部资源并将其加载到您的程序中;例如,我将编写一个程序,递归搜索程序所在文件夹的所有子目录,并将每个文件映射到程序中的可寻址资源。

当您在 Visual Studio 中运行该程序时,这不是问题,因为必须读入的文件位于项目的源目录中,并且默认情况下,当 Visual Studio 调试您的程序时,它使用源目录作为程序的工作目录,而当您单独运行 .exe 时,它​​使用可执行文件所在的目录(或运行它的脚本所在的目录)。

关于c++ - .exe 不会编译,但在 visual studio 中运行时会编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36700692/

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