glew链接问题qt创建者qmake



我正试图让一个项目使用SDL2、assimp、opengl和glew,但无法让glew正确链接(我认为这几乎是一个重复的问题,但却是一个更全面的问答)

我的qmake.pr文件:

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 middlewareglm\" 
                 "C:code middlewareSDL2-2.0.3include\" 
                "C:Userssmart_000Desktopassimpinclude\"
DEPENDPATH += "C:/code middleware/glew-1.10.0/bin/ReleaseWin32/" 
                "C:code middlewareSDL2-2.0.3lib/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 middlewareSDL2-2.0.3libx86" -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

我得到的链接器错误:链接器错误

我已经尝试过的:

  • 检查文件路径问题(文件名中的"/"one_answers"\"类内容和空格等)
  • 动态和静态链接(是的,我在需要的地方定义了GLEW_STATIC,并链接到-lglew32s等)
  • SDL的东西:扰乱并定义上面的"NO_SDL_GLEXT"
  • 制作测试程序并尝试仅用g++将其链接(我在尝试静态程序时使用了-static标志,并将链接器标志放在需要它们的文件之后)。这些错误与qt错误减去警告后的错误相同。

  • 将glew源代码直接放在我的项目中并构建它(完全相同的错误)---这些问题非常相似,对我来说毫无意义。我已经评论掉了qmake的内容,并重新运行qmake;我没有意识到,如果我像以前一样把它放在我的项目中,我可能会得到这样的链接器错误。

  • 在我的改变后运行qmake,哈哈
  • 在绝望中移动"LIBS"one_answers"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, '', sizeof(line));
    }
    while(fgets(line, MAX_LINE_LENGTH, fragmentFile) != NULL)
    {
        fragmentShaderSource.push_back((GLchar*)line);
        memset((void*)line, '', 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;
}

发布问题后,我发现了问题。令人尴尬的是,这是我以前在使用assimp时遇到的一个问题(尽管我现在才意识到为什么用cmake重新构建它有效)。

特征:

  • 当您知道正在查找库时,库中会出现奇怪的链接器错误
  • 您主要在windows系统上工作:)

解决方案:

  • 检查您正在与Qt创建者一起使用的构建工具包Vs您正在使用的库。

    我只使用了MINGW,我的库是使用MSVC++编译器编译的

  • 您要查找的库是.a文件:特别是lib{name}.a。在这种情况下,我要查找的是libglew32.dll.a<-请注意其中的.dll是dll导入库还是像libglew32s.a<-这样的静态库注意s表示static。

  • 去哪里获得权利libs:

    -去这里建造它:建筑在窗户上闪闪发光

    -转到这里下载我做的预构建的(glew的旧版本):https://launchpad.net/glew-cmake/+里程碑/11.0

    我使用的下载链接:glew-gcc-1.10.0-win32.zip (md5) Glew-Cmake 1.10.0 Binaries (MinGW)<-我试着发布一张照片,但显然,我还不够冷静。

我的更新和工作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

注意:不要忘记libs(-lglew32.dll)末尾的.dll。

-快乐链接

最新更新