glew 链接问题 qt creator qmake
glew linking problems qt creator qmake
我正在尝试让一个项目与 SDL2、assimp、opengl 和 glew 一起工作,但无法正确地让 glew 到 link(几乎是重复但更全面的问答,我想)。
我的 qmake .pro 文件:
CONFIG += console
CONFIG -= app_bundle
CONFIG -= qt
HEADERS += \
objloader.h \
display.h \
eventloop.h \
shader.h \
texture.h
SOURCES += main.cpp \
objloader.cpp \
display.cpp \
eventloop.cpp \
shader.cpp \
texture.cpp
INCLUDEPATH += "C:/code middleware/glew-1.12.0/include/" \
"C:\code middleware\glm\" \
"C:\code middleware\SDL2-2.0.3\include\" \
"C:\Users\smart_000\Desktop\assimp\include\"
DEPENDPATH += "C:/code middleware/glew-1.10.0/bin/Release\Win32/" \
"C:\code middleware\SDL2-2.0.3\lib/x86/" \
"C:/Users/smart_000/Desktop/assimp/bin/" \
"C:/code middleware/glew-1.12.0/lib/Release/Win32/" \
"C:/code middleware/glew-1.12.0/bin/Release/Win32/"
LIBS += -L"C:\code middleware\SDL2-2.0.3\lib\x86" -lSDL2main -lSDL2
LIBS += -L"C:/Users/smart_000/Desktop/assimp/lib/" -lassimp.dll -lzlib
LIBS += -lopengl32
LIBS += -lglu32
LIBS += -L"C:/code middleware/glew-1.12.0/lib/Release/Win32/" -lglew32 -lglu32
我遇到的 linker 错误:linker errors
我已经尝试过的:
- 检查文件路径问题(“/”和“\”之类的东西和文件名中的空格等)
- 动态和静态链接(是的,我在需要的地方定义了
GLEW_STATIC
,然后我 link 编辑了 -lglew32s 等)
- SDL 东西:搞乱并在其上方定义 'NO_SDL_GLEXT'
制作测试程序并尝试 link 它仅使用 g++(我在尝试使用静态标志时使用了 -static 标志并放置了 link er 标志在需要它们的文件之后)。这些错误与 qt 中的错误相同但没有警告。
将 glew 源代码直接放在我的项目中并构建它(完全相同的错误)--- 这些问题非常相似,对我来说毫无意义.我已经注释掉了 qmake 的东西并重新 运行 qmake;我不知道如果我像以前那样将它放入我的项目中,我可能会遇到这样的 linker 错误。
- 运行 qmake 经过我的修改,哈哈
- 把'LIBS'和'DEPENDPATH'搬来搬去,无奈之下加了'CONFIG += opengl'
- 搞乱调试和发布版本。
我没试过的:
- 将库和东西移动到系统路径
- 确保库是为 MINGW 构建的!
相关代码(我知道这很糟糕;我遇到这些问题时只是在乱搞):
"main.cpp" :
#include <GL/glew.h>
#include <iostream>
#include <SDL.h>
#include <objloader.h>
#include "display.h"
#include "eventloop.h"
Display* display = NULL;
void callback()
{
std::cout << "yay" << std::endl;
display->Swap();
}
int main(int argc, char* argv[])
{
UShortVector indices;
Vec3Vector vertices;
Vec2Vector uvs;
Vec3Vector normals;
bool success = ObjLoader::loadObj("cube.obj", indices, vertices, uvs, normals);
display = new Display();
EventLoop eventLoop;
eventLoop.SetLoopCallback(&callback);
display->Create("yay");
eventLoop.Start();
return 0;
}
"display.h"
#ifndef DISPLAY_H
#define DISPLAY_H
#include <GL/glew.h>
#include <SDL.h>
#include <iostream>
class Display
{
public:
Display();
~Display();
void Create(const char* title);
void Swap();
SDL_Window* window_ = NULL;
SDL_GLContext glContext_;
};
#endif // DISPLAY_H
"shader.h"
#ifndef SHADER_H
#define SHADER_H
#include <GL/glew.h>
#include <stdio.h>
#include <stdlib.h>
#include <vector>
#include <memory.h>
class Shader
{
public:
GLuint LoadShaders(const char * vertex_file_path, const char * fragment_file_path);
private:
Shader();
~Shader();
};
#endif // SHADER_H
"shader.cpp"
#include "shader.h"
Shader::Shader()
{
}
Shader::~Shader()
{
}
GLuint Shader::LoadShaders(const char * vertexShaderPath, const char * fragmentShaderPath)
{
FILE* vertexFile = fopen(vertexShaderPath, "r");
FILE* fragmentFile = fopen(fragmentShaderPath, "r");
if(!vertexFile || !fragmentFile)
{
if(!vertexFile)
{
perror("could not open the vertex shader file");
}
if(!fragmentFile)
{
perror("could not open the fragment shader file");
}
}
GLuint programID = glCreateProgram();
GLuint vertShader = glCreateShader(GL_VERTEX_SHADER);
GLuint fragShader = glCreateShader(GL_FRAGMENT_SHADER);
const size_t MAX_LINE_LENGTH = 120;
char line[MAX_LINE_LENGTH];
std::vector<GLchar*> vertShaderSource;
std::vector<GLchar*> fragmentShaderSource;
while(fgets(line, MAX_LINE_LENGTH, vertexFile) != NULL)
{
vertShaderSource.push_back((GLchar*)line);
memset((void*)line, '[=14=]', sizeof(line));
}
while(fgets(line, MAX_LINE_LENGTH, fragmentFile) != NULL)
{
fragmentShaderSource.push_back((GLchar*)line);
memset((void*)line, '[=14=]', sizeof(line));
}
glShaderSource(vertShader, vertShaderSource.size(), (const GLchar**)&vertShaderSource, NULL);
glShaderSource(fragShader, fragmentShaderSource.size(), (const GLchar**)&fragmentShaderSource, NULL);
// doesn't do anything at the moment, I know. It should still compile though.
return programID;
}
在我 post 提出问题后,我立即找到了问题所在。令人尴尬的是,这是我之前使用 assimp 运行 遇到的一个问题(尽管我现在才意识到为什么用 cmake 重新构建它有效)。
特点:
- 奇怪的 link当您知道正在找到库时库出现错误。
- 您主要在 windows 系统上工作:)
解决方法:
检查您与 Qt Creator Vs 一起使用的构建工具包。您正在使用的库。
我只使用 MINGW,我的库是使用 MSVC++ 编译器编译的
您要查找的库是 .a 文件:特别是 lib{name}.a 。在这种情况下,我正在寻找 libglew32.dll.a <- 注意那里的 .dll 是一个 dll 导入库还是一个静态库,比如 libglew32s.a <- 注意 s 代表静态。
去哪里获取权限库:
- 到这里构建它:Building glew on windows with mingw。
- 到这里下载我做的预构建的(旧版本的 glew):https://launchpad.net/glew-cmake/+milestone/1.10.0
我使用的下载 link:glew-gcc-1.10.0-win32.zip (md5) Glew-Cmake 1.10.0 Binaries (MinGW)
<- 我尝试 post 一张照片,但显然,我还不够酷,无法做到这一点。
我更新后的工作 qmake .pro 文件:
TEMPLATE = app
CONFIG += console
CONFIG -= app_bundle
CONFIG -= qt
HEADERS += \
objloader.h \
display.h \
eventloop.h \
shader.h \
texture.h
SOURCES += main.cpp \
objloader.cpp \
display.cpp \
eventloop.cpp \
shader.cpp \
texture.cpp
INCLUDEPATH += "C:/code middleware/glew-gcc-1.10.0-win32/include/" \
"C:/code middleware/glm/" \
"C:/code middleware/SDL2-2.0.3/include/" \
"C:/Users/smart_000/Desktop/assimp/include/"
DEPENDPATH += "C:/code middleware/SDL2-2.0.3/lib/x86/" \
"C:/Users/smart_000/Desktop/assimp/bin/" \
"C:/code middleware/glew-gcc-1.10.0-win32/lib/" \
"C:/code middleware/glew-gcc-1.10.0-win32/bin/"
LIBS += -L"C:/code middleware/SDL2-2.0.3/lib/x86" -lSDL2main -lSDL2
LIBS += -L"C:/Users/smart_000/Desktop/assimp/lib/" -lassimp.dll -lzlib
LIBS += -L"C:/code middleware/glew-gcc-1.10.0-win32/lib/" -lglew32.dll
LIBS += -lopengl32
LIBS += -lglu32
注意:不要忘记库末尾的 .dll (-lglew32.dll)。
- 链接愉快!
我正在尝试让一个项目与 SDL2、assimp、opengl 和 glew 一起工作,但无法正确地让 glew 到 link(几乎是重复但更全面的问答,我想)。
我的 qmake .pro 文件:
CONFIG += console
CONFIG -= app_bundle
CONFIG -= qt
HEADERS += \
objloader.h \
display.h \
eventloop.h \
shader.h \
texture.h
SOURCES += main.cpp \
objloader.cpp \
display.cpp \
eventloop.cpp \
shader.cpp \
texture.cpp
INCLUDEPATH += "C:/code middleware/glew-1.12.0/include/" \
"C:\code middleware\glm\" \
"C:\code middleware\SDL2-2.0.3\include\" \
"C:\Users\smart_000\Desktop\assimp\include\"
DEPENDPATH += "C:/code middleware/glew-1.10.0/bin/Release\Win32/" \
"C:\code middleware\SDL2-2.0.3\lib/x86/" \
"C:/Users/smart_000/Desktop/assimp/bin/" \
"C:/code middleware/glew-1.12.0/lib/Release/Win32/" \
"C:/code middleware/glew-1.12.0/bin/Release/Win32/"
LIBS += -L"C:\code middleware\SDL2-2.0.3\lib\x86" -lSDL2main -lSDL2
LIBS += -L"C:/Users/smart_000/Desktop/assimp/lib/" -lassimp.dll -lzlib
LIBS += -lopengl32
LIBS += -lglu32
LIBS += -L"C:/code middleware/glew-1.12.0/lib/Release/Win32/" -lglew32 -lglu32
我遇到的 linker 错误:linker errors
我已经尝试过的:
- 检查文件路径问题(“/”和“\”之类的东西和文件名中的空格等)
- 动态和静态链接(是的,我在需要的地方定义了
GLEW_STATIC
,然后我 link 编辑了 -lglew32s 等) - SDL 东西:搞乱并在其上方定义 'NO_SDL_GLEXT'
制作测试程序并尝试 link 它仅使用 g++(我在尝试使用静态标志时使用了 -static 标志并放置了 link er 标志在需要它们的文件之后)。这些错误与 qt 中的错误相同但没有警告。
将 glew 源代码直接放在我的项目中并构建它(完全相同的错误)--- 这些问题非常相似,对我来说毫无意义.我已经注释掉了 qmake 的东西并重新 运行 qmake;我不知道如果我像以前那样将它放入我的项目中,我可能会遇到这样的 linker 错误。
- 运行 qmake 经过我的修改,哈哈
- 把'LIBS'和'DEPENDPATH'搬来搬去,无奈之下加了'CONFIG += opengl'
- 搞乱调试和发布版本。
我没试过的:
- 将库和东西移动到系统路径
- 确保库是为 MINGW 构建的!
相关代码(我知道这很糟糕;我遇到这些问题时只是在乱搞):
"main.cpp" :
#include <GL/glew.h>
#include <iostream>
#include <SDL.h>
#include <objloader.h>
#include "display.h"
#include "eventloop.h"
Display* display = NULL;
void callback()
{
std::cout << "yay" << std::endl;
display->Swap();
}
int main(int argc, char* argv[])
{
UShortVector indices;
Vec3Vector vertices;
Vec2Vector uvs;
Vec3Vector normals;
bool success = ObjLoader::loadObj("cube.obj", indices, vertices, uvs, normals);
display = new Display();
EventLoop eventLoop;
eventLoop.SetLoopCallback(&callback);
display->Create("yay");
eventLoop.Start();
return 0;
}
"display.h"
#ifndef DISPLAY_H
#define DISPLAY_H
#include <GL/glew.h>
#include <SDL.h>
#include <iostream>
class Display
{
public:
Display();
~Display();
void Create(const char* title);
void Swap();
SDL_Window* window_ = NULL;
SDL_GLContext glContext_;
};
#endif // DISPLAY_H
"shader.h"
#ifndef SHADER_H
#define SHADER_H
#include <GL/glew.h>
#include <stdio.h>
#include <stdlib.h>
#include <vector>
#include <memory.h>
class Shader
{
public:
GLuint LoadShaders(const char * vertex_file_path, const char * fragment_file_path);
private:
Shader();
~Shader();
};
#endif // SHADER_H
"shader.cpp"
#include "shader.h"
Shader::Shader()
{
}
Shader::~Shader()
{
}
GLuint Shader::LoadShaders(const char * vertexShaderPath, const char * fragmentShaderPath)
{
FILE* vertexFile = fopen(vertexShaderPath, "r");
FILE* fragmentFile = fopen(fragmentShaderPath, "r");
if(!vertexFile || !fragmentFile)
{
if(!vertexFile)
{
perror("could not open the vertex shader file");
}
if(!fragmentFile)
{
perror("could not open the fragment shader file");
}
}
GLuint programID = glCreateProgram();
GLuint vertShader = glCreateShader(GL_VERTEX_SHADER);
GLuint fragShader = glCreateShader(GL_FRAGMENT_SHADER);
const size_t MAX_LINE_LENGTH = 120;
char line[MAX_LINE_LENGTH];
std::vector<GLchar*> vertShaderSource;
std::vector<GLchar*> fragmentShaderSource;
while(fgets(line, MAX_LINE_LENGTH, vertexFile) != NULL)
{
vertShaderSource.push_back((GLchar*)line);
memset((void*)line, '[=14=]', sizeof(line));
}
while(fgets(line, MAX_LINE_LENGTH, fragmentFile) != NULL)
{
fragmentShaderSource.push_back((GLchar*)line);
memset((void*)line, '[=14=]', sizeof(line));
}
glShaderSource(vertShader, vertShaderSource.size(), (const GLchar**)&vertShaderSource, NULL);
glShaderSource(fragShader, fragmentShaderSource.size(), (const GLchar**)&fragmentShaderSource, NULL);
// doesn't do anything at the moment, I know. It should still compile though.
return programID;
}
在我 post 提出问题后,我立即找到了问题所在。令人尴尬的是,这是我之前使用 assimp 运行 遇到的一个问题(尽管我现在才意识到为什么用 cmake 重新构建它有效)。
特点:
- 奇怪的 link当您知道正在找到库时库出现错误。
- 您主要在 windows 系统上工作:)
解决方法:
检查您与 Qt Creator Vs 一起使用的构建工具包。您正在使用的库。
我只使用 MINGW,我的库是使用 MSVC++ 编译器编译的
您要查找的库是 .a 文件:特别是 lib{name}.a 。在这种情况下,我正在寻找 libglew32.dll.a <- 注意那里的 .dll 是一个 dll 导入库还是一个静态库,比如 libglew32s.a <- 注意 s 代表静态。
去哪里获取权限库:
- 到这里构建它:Building glew on windows with mingw。
- 到这里下载我做的预构建的(旧版本的 glew):https://launchpad.net/glew-cmake/+milestone/1.10.0
我使用的下载 link:
glew-gcc-1.10.0-win32.zip (md5) Glew-Cmake 1.10.0 Binaries (MinGW)
<- 我尝试 post 一张照片,但显然,我还不够酷,无法做到这一点。
我更新后的工作 qmake .pro 文件:
TEMPLATE = app
CONFIG += console
CONFIG -= app_bundle
CONFIG -= qt
HEADERS += \
objloader.h \
display.h \
eventloop.h \
shader.h \
texture.h
SOURCES += main.cpp \
objloader.cpp \
display.cpp \
eventloop.cpp \
shader.cpp \
texture.cpp
INCLUDEPATH += "C:/code middleware/glew-gcc-1.10.0-win32/include/" \
"C:/code middleware/glm/" \
"C:/code middleware/SDL2-2.0.3/include/" \
"C:/Users/smart_000/Desktop/assimp/include/"
DEPENDPATH += "C:/code middleware/SDL2-2.0.3/lib/x86/" \
"C:/Users/smart_000/Desktop/assimp/bin/" \
"C:/code middleware/glew-gcc-1.10.0-win32/lib/" \
"C:/code middleware/glew-gcc-1.10.0-win32/bin/"
LIBS += -L"C:/code middleware/SDL2-2.0.3/lib/x86" -lSDL2main -lSDL2
LIBS += -L"C:/Users/smart_000/Desktop/assimp/lib/" -lassimp.dll -lzlib
LIBS += -L"C:/code middleware/glew-gcc-1.10.0-win32/lib/" -lglew32.dll
LIBS += -lopengl32
LIBS += -lglu32
注意:不要忘记库末尾的 .dll (-lglew32.dll)。