我想做的是使用glUseProgram();这是一个OpenGL功能 然而,使用它会返回问题......
为什么?
因为显然甚至在声明一个单独的头文件时 使用声明的extern变量,然后在main.cpp文件中使用它 用户定义的OpenGL Engine结构定义给出了错误 与MSVC 2013
以下是仅使用通用c ++的测试用例:
variable_header.hpp
extern int ProgramID = whateverfunctionyouwant();
OGL_Engine.hpp
#ifndef __OGL_ENGINE_HPP__
#define __OGL_ENGINE_HPP__
struct OGL_Engine {
int Setup();
int ShaderSetup();
};
#endif
OGL_Engine.cpp
#ifndef __OGL_ENGINE_CPP__
#define __OGL_Engine_CPP__
int OGL_Engine::Setup(){
int whatever = 0;
}
int OGL_Engine::ShaderSetup(){
int readfile = 0;
afunctionyouwant(ProgramID);
}
#endif
我得到的错误是:
错误3错误LNK1169:找到一个或多个多重定义的符号
这发生在我的原始文件中,而不是测试用例,但它应该说这是我希望的。
答案 0 :(得分:1)
这里要记住两件事:
extern int ProgramID = whateverfunctionyouwant();
的标题将在每个C文件中声明和定义变量ProgramID
。extern
关键字的声明形式。这将告诉编译器为变量分配多少存储空间等。要使用此信息,请将variable_header.hpp
更改为仅声明extern,而不是指定它(确保包含标题保护):
#ifndef __VARIABLE_HEADER_HPP__
#define __VARIABLE_HEADER_HPP__
extern int ProgramID;
#endif
并修改一个源文件(比如OGL_Engine.cpp
)以全局声明变量(在文件中但在任何函数,类,结构或命名空间之外):
int ProgramID = whateverfunctionyouwant();
您的示例缺少的是C文件或匹配标头中的#include "variable_header.hpp"
。假设include在那里,编译器将知道ProgramID
引用在别处声明的名称,并在链接阶段将它与正确的内存位置匹配。当编译器到达定义变量的文件时,将使用正确的符号标记它,无论该文件中是否为extern
。这种情况发生在全局声明的任何变量上。
答案 1 :(得分:0)
您不应在头文件中定义变量,否则如果在多个源文件中包含此类头文件,则会出现上述错误。
extern int ProgramID = whateverfunctionyouwant();
只需使用 extern 来声明
extern int ProgramID;
然后在源文件
中定义它