Mingw-W64编译Windows程序提示:undefined reference to `__imp_GetStockObject' 的解决方法

本文介绍使用GCC(Mingw-W64)编译Windows程序时遇到的undefined reference to `__imp_GetStockObject'错误,并提供了解决方案。通过在编译命令中加入-mwindows选项,可以成功解决该问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

gcc(Mingw-W64)编译windows程序,提示undefined reference to `__imp_GetStockObject' 的解决方法:加上-mwindows,问题解决。

 

#include <windows.h>

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int iCmdShow)
{
    WNDCLASSEX wndclass;
    static LPCTSTR szAppName = TEXT("HelloWin");
    HWND   hWnd;
    MSG    msg;

    wndclass.cbSize = sizeof(WNDCLASSEX);
    wndclass.style = CS_HREDRAW | CS_VREDRAW;

    wndclass.lpfnWndProc = WndProc;

    wndclass.cbClsExtra = 0;
    wndclass.cbWndExtra = 0;

    wndclass.hInstance = hInstance;

    wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);

    wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);

    wndclass.lpszMenuName = NULL;
    wndclass.lpszClassName = szAppName;
    wndclass.hIconSm = NULL;

    RegisterClassEx(&wndclass);


    hWnd = CreateWindow(szAppName,  // window class name
        TEXT("Windows Demo"),   // window title
        WS_OVERLAPPEDWINDOW,        // window style
        CW_USEDEFAULT,              // initial x position
        CW_USEDEFAULT,              // initial y position
        CW_USEDEFAULT,              // initial x size
        CW_USEDEFAULT,              // initial y size
        NULL,                    // parent window handle
        NULL,                    // window menu handle
        hInstance,                  // program instance handle
        NULL);                   // creation parameters

    ShowWindow(hWnd, iCmdShow);     // display the window
    UpdateWindow(hWnd);             // redraw window client area

    while (GetMessage(&msg, NULL, 0, 0) == TRUE)
    {
        TranslateMessage(&msg);     // translate the message
        DispatchMessage(&msg);      // dispatch the message
    }

    return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    HDC             hdc;
    PAINTSTRUCT     ps;
    RECT            rect;

    switch (message)
    {
    case WM_PAINT:
        hdc = BeginPaint(hwnd, &ps);
        GetClientRect(hwnd, &rect);
        SetBkMode(hdc, TRANSPARENT);

        DrawText(hdc, TEXT("Hello, Win32!"), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);

        EndPaint(hwnd, &ps);
        return 0;

    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    }
    return DefWindowProc(hwnd, message, wParam, lParam);
}

 

Opengl(.text+0x54e): undefined reference to `__imp___glewCreateShader' (.text+0x568): undefined reference to `__imp___glewShaderSource' (.text+0x585): undefined reference to `__imp___glewCompileShader' (.text+0x5b5): undefined reference to `__imp___glewCreateProgram' (.text+0x5be): undefined reference to `__imp___glewAttachShader' (.text+0x5d7): undefined reference to `__imp___glewLinkProgram' (.text+0x5e3): undefined reference to `__imp___glewDeleteShader' (.text+0x622): undefined reference to `__imp___glewUseProgram' (.text+0x6f8): undefined reference to `__imp___glewUniformMatrix4fv' (.text+0x706): undefined reference to `__imp___glewGetUniformLocation' (.text+0x773): undefined reference to `__imp___glewUniform3fv' (.text+0x79a): undefined reference to `__imp___glewBindVertexArray' (.text+0xa21): undefined reference to `__imp___glewGenVertexArrays' (.text+0xa32): undefined reference to `__imp___glewGenBuffers' (.text+0xa52): undefined reference to `__imp___glewBindBuffer' (.text+0xa79): undefined reference to `__imp___glewBufferData' (.text+0xa8b): undefined reference to `__imp___glewVertexAttribPointer' (.text+0xab5): undefined reference to `__imp___glewEnableVertexAttribArray' (.text+0xca2): undefined reference to `__imp___glewGenVertexArrays' (.text+0xd36): undefined reference to `__imp___glewEnableVertexAttribArray' (.text.startup+0x71): undefined reference to `__imp_glewExperimental' (.text.startup+0x7a): undefined reference to `__imp_glewInit' (.text.startup+0x29e): undefined reference to `__imp___glewDeleteProgram'和[错误] ld returned 1 exit status
最新发布
04-01
<think>好的,我现在需要帮助用户解决他们在编译OpenGL程序时遇到的链接错误。错误信息显示很多未定义的引用,比如`__imp___glewCreateShader`,还有最后的ld返回1退出状态。这些都是典型的链接错误,说明编译不到对应的函数实现。 首先,我得回忆一下OpenGL和GLEW的相关知识。GLEW是用来管理OpenGL扩展的库,它允许开发者使用较新版本的OpenGL函数。用户在使用GLEW时,如果没有正确链接库文件,就会出现这样的错误。错误信息中的`__imp___`前缀可能表明他们是在Windows上使用MinGW编译器,因为这种格式通常和Windows的导入库有关。 接下来,我需要考虑可能的原因。最常见的问题是没有正确链接GLEW的库文件。比如,在编译命令中缺少`-lglew32`或者类似的选项。另外,用户可能没有正确安装GLEW,或者安装的版本与编译器不兼容,比如32位和64位的问题。 另一个可能性是GLEW的静态库和动态库的使用方式不同。如果用户使用的是静态库,可能需要定义预处理器宏,如`GLEW_STATIC`,这可能会影响符号的链接方式。此外,头文件的包含路径是否正确也是需要检查的,虽然链接错误通常不涉及头文件,但确保包含正确总是好的。 用户还可能混淆了不同版本的GLEW库,比如使用`glew32``glew32s``glew32mx`等,不同的库对应不同的配置。静态库和动态库的链接选项也不同,比如动态链接可能需要`-lglew32`,而静态链接可能需要`-lglew32s`,同时加上`-static`参数。 还有,编译器的链接顺序可能有问题。通常需要把库放在源文件之后,因为链接器是按顺序解析符号的。如果库放在前面,可能无法正确解析依赖。此外,可能需要同时链接其他相关库,如OpenGL的库`-lopengl32`,或者窗口管理库如`-lglfw3`,如果用户用了GLFW的话。 用户的环境配置也需要考虑。他们是否在正确的路径下安装了GLEW的开发文件?比如,在Linux下可能需要安装`libglew-dev`,而Windows下需要将头文件和库文件放在编译器能到的位置,如MinGW的include和lib目录。 现在,我需要将这些可能性整理成一个清晰的步骤,帮助用户逐一排查。首先检查编译命令是否正确,确保链接了GLEW和其他必要的库,然后确认库的安装位置是否正确,最后检查代码中是否正确初始化和使用了GLEW的函数。 另外,用户可能在代码中没有正确初始化GLEW,导致函数指针没有被加载。比如,在调用GLEW函数之前,必须确保调用了`glewInit()`,并且检查其返回值。如果初始化失败,后续的函数调用就会导致未定义的行为,但这里的错误是链接时的,所以更可能和链接配置有关。 最后,错误中的`ld returned 1 exit status`是链接器失败的结果,所以问题肯定出在链接阶段,而不是编译阶段。需要确保所有需要的库都被正确链接,并且顺序正确,路径正确,没有拼写错误,库文件存在且兼容当前的编译环境。</think>这个错误属于OpenGL程序开发中常见的**链接器错误**,根本原因是**GLEW库未被正确链接**。以下是分步骤解决方案: --- ### 一、错误原因分析 错误信息如`undefined reference to __imp___glewXXX`表示: 1. **未链接GLEW库**:编译不到GLEW函数的具体实现 2. **库文件路径问题**:GLEW库文件未正确配置到编译环境中 3. **静态/动态库混淆**:使用了错误的库类型(如动态库未放置到运行目录) --- ### 二、解决方案步骤 #### 1. 确认GLEW安装 - **Windows**: - 下载预编译包:[GLEW官网](http://glew.sourceforge.net/) -`glew32.dll`放入系统目录(或程序运行目录) -`include/GL`头文件放入编译器包含路径 -`lib/Release/Win32``x64`的库文件放入编译器库路径 - **Linux**: ```bash sudo apt-get install libglew-dev ``` #### 2. 修改编译命令 根据编译器类型添加链接选项: ```bash # Windows (MinGW) 示例 g++ main.cpp -o program -lglew32 -lopengl32 -lglfw3 # Linux 示例 g++ main.cpp -o program -lGLEW -lGL -lglfw ``` #### 3. 静态库特殊处理(如需) 若使用**静态库**需添加宏定义```cpp #define GLEW_STATIC // 必须在包含glew.h之前定义 #include <GL/glew.h> ``` 编译命令需指定静态库: ```bash g++ main.cpp -o program -lglew32s -lopengl32 -static ``` #### 4. 验证GLEW初始化 确保在代码中正确初始化: ```cpp glewExperimental = GL_TRUE; // 修复核心配置文件问题 if (glewInit() != GLEW_OK) { std::cerr << "GLEW初始化失败" << std::endl; return -1; } ``` --- ### 三、常见问题排查表 | 现象 | 解决方案 | |---------|---------| | Windows`__imp__`前缀错误 | 确保使用`-lglew32`而非`-lglew32s`(动态库 vs 静态库) | | 编译通过但运行时崩溃 | 将`glew32.dll`复制到可执行文件目录 | | Linux下不到`-lGLEW` | 安装`libglew-dev`包 | | 使用GLFW时链接顺序错误 | 库顺序应为`-lglfw3 -lGLEW -lGL` | --- ### 四、完整编译示例(Windows+MinGW```bash g++ main.cpp -I"D:/glew/include" -L"D:/glew/lib/Release/Win32" \ -o program.exe -lglew32 -lopengl32 -lglfw3 -lgdi32 ``` 通过以上步骤可解决99%的GLEW链接错误。若问题仍存在,建议检查库文件位数(32/64位)是否与编译器匹配。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值