为啥我应该没有错时却出现链接错误
Posted
技术标签:
【中文标题】为啥我应该没有错时却出现链接错误【英文标题】:Why do I get a linking error when there should be nothing wrong为什么我应该没有错时却出现链接错误 【发布时间】:2020-04-19 10:54:49 【问题描述】:我是一名 Java 开发人员,最近改用 C++。我一直在尝试制作一个小的 OpenGL 程序,但遇到了问题。每当我尝试编译我的着色器程序时,它都会出现链接错误。这里是:
ERROR::SHADER::PROGRAML::LINKING_ERROR
Link info
---------
error: "TexCoord" not declared as an output from the previous stage
这里是着色器文件:
顶点:
#version 440 core
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec3 aColor;
layout (location = 2) in vec2 aTexCoord;
out vec3 ourColor;
out vec2 TexCoord;
void main()
gl_Position = vec4(aPos, 1.0);
ourColor = aColor;
TexCoord = vec2(aTexCoord.x, aTexCoord.y);
片段
#version 440 core
out vec4 FragColor;
in vec3 ourColor;
in vec2 TexCoord;
// texture sampler
uniform sampler2D texture1;
void main()
FragColor = texture(texture1, TexCoord);
这是着色器的创建:
int success;
char infoLog[512];
const char* vertexSource;
const char* fragmentSource;
// Load in shader source
std::ifstream inFile;
inFile.open(vertexPath);
std::string temp = "";
std::string source = "";
if (inFile.is_open())
while (std::getline(inFile, temp))
source += temp + "\n";
else
std::cout << "ERROR::SHADER::VERTEX::COULD_NOT_OPEN_SOURCE_FILE" << std::endl;
inFile.close();
vertexSource = source.c_str();
temp = "";
source = "";
inFile.open(fragmentPath);
if (inFile.is_open())
while (std::getline(inFile, temp))
source += temp + "\n";
else
std::cout << "ERROR::SHADER::FRAGMENT::COULD_NOT_OPEN_SOURCE_FILE" << std::endl;
inFile.close();
fragmentSource = source.c_str();
unsigned int vertexShader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertexShader, 1, &vertexSource, nullptr);
glCompileShader(vertexShader);
glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success);
if (!success)
glGetShaderInfoLog(vertexShader, 512, nullptr, infoLog);
std::cout << "ERROR::SHADER::VERTEX::COULD_NOT_COMPILE\n" << infoLog << std::endl;
unsigned int fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragmentShader, 1, &fragmentSource, nullptr);
glCompileShader(fragmentShader);
glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success);
if (!success)
glGetShaderInfoLog(fragmentShader, 512, nullptr, infoLog);
std::cout << "ERROR::SHADER::FRAGMENT::COULD_NOT_COMPILE\n" << infoLog << std::endl;
// Program
ID = glCreateProgram();
glAttachShader(ID, vertexShader);
glAttachShader(ID, fragmentShader);
glLinkProgram(ID);
glGetProgramiv(ID, GL_LINK_STATUS, &success);
if (!success)
glGetProgramInfoLog(ID, 512, nullptr, infoLog);
std::cout << "ERROR::SHADER::PROGRAML::LINKING_ERROR\n" << infoLog << std::endl;
glDeleteShader(vertexShader);
glDeleteShader(fragmentShader);
glUseProgram(0);
据我了解,只有当我尝试链接的两个变量的名称或类型不同时,我才会收到此错误,但它们确实如此。我只是不明白。
谢谢。
【问题讨论】:
您是否真的将两个着色器都正确地附加到了着色器程序中?您可能希望显示您的着色器创建代码,因为着色器看起来不错。 @BDL 哦,是的,对不起。我已经编辑了我的问题。 【参考方案1】:你基本上有...
std::string source;
const char *vertexSource;
const char *fragmentSource;
...read into source...
vertexSource = source.c_str();
...read into source...
fragmentSource = source.c_str();
存储在vertexSource
中的指针将在第二次读取source
时失效。来自documentation
从 c_str() 获得的指针可能会通过以下方式失效:
将对字符串的非常量引用传递给任何标准库函数,或者 在字符串上调用非常量成员函数,不包括 operator[]、at()、front()、back()、begin()、rbegin()、end() 和 撕裂()。
【讨论】:
啊,这比我想象的要容易。我修好了,非常感谢!以上是关于为啥我应该没有错时却出现链接错误的主要内容,如果未能解决你的问题,请参考以下文章
为啥在使用 HttpWebRequest 时某些链接上出现“(304)未修改”错误?
为啥在将 liblas 链接到 Qt 后出现未定义的参考错误?