【问题标题】:My c++ programs won't compile after I close the source then open it again关闭源代码然后再次打开后,我的 c++ 程序将无法编译
【发布时间】:2015-01-07 14:57:07
【问题描述】:

我编译它,它运行,然后我重新打开它,它不再工作了。 这发生在 devc++ 5.8.3 和代码块中。

我的代码(默认的 cmets 来自 IDE):

    #include <windows.h>
    #include <cmath>
    #include <cstdlib>

    HPEN hPen;
    HDC hDC;
    PAINTSTRUCT Ps;

    void DrawLine(int x1, int y1, int x2, int y2, HPEN pen){
        SelectObject(hDC,pen);
        MoveToEx(hDC,x1,y1,NULL);
        LineTo(hDC,x2,y2);
    }
    void Draw(int originx, int originy, float value,int handlength){
        DrawLine(originx, originy, (handlength*cos(value*180/3.14))+originx, (handlength*sin(value*180/3.14))+originy,hPen);
        DrawLine(originx, originy, -(handlength*cos(value*180/3.14))+originx, -(handlength*sin(value*180/3.14))+originy,hPen);
    }
    /* This is where all the input to the window goes to */
    LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) {
        switch(Message) {

            /* Upon destruction, tell the main thread to stop */
            case WM_DESTROY: {
                PostQuitMessage(0);
                break;
            }
            case WM_PAINT: {
                int r;
                int g;
                int b;
                hDC = BeginPaint(hwnd, &Ps);
                for(int i=0;i<170;i=i+1){   
                r = rand() % 256;
                g = rand() % 256;
                b = rand() % 256;
                Sleep(10);
                hPen = CreatePen(PS_INSIDEFRAME, 1, RGB(r, g, b));
                Draw(320,240,i,180);

                }       
                EndPaint(hwnd, &Ps);
                break;
            }
            /* All other messages (a lot of them) are processed using default procedures */
            default:
                return DefWindowProc(hwnd, Message, wParam, lParam);
        }
        return 0;
    }

    /* The 'main' function of Win32 GUI programs: this is where execution starts */
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
        WNDCLASSEX wc; /* A properties struct of our window */
        HWND hwnd; /* A 'HANDLE', hence the H, or a pointer to our window */
        MSG msg; /* A temporary location for all messages */

        /* zero out the struct and set the stuff we want to modify */
        memset(&wc,0,sizeof(wc));
        wc.cbSize        = sizeof(WNDCLASSEX);
        wc.lpfnWndProc   = WndProc; /* This is where we will send messages to */
        wc.hInstance     = hInstance;
        wc.hCursor       = LoadCursor(NULL, IDC_ARROW);

        /* White, COLOR_WINDOW is just a #define for a system color, try Ctrl+Clicking it */
        wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
        wc.lpszClassName = "WindowClass";
        wc.hIcon         = LoadIcon(NULL, IDI_APPLICATION); /* Load a standard icon */
        wc.hIconSm       = LoadIcon(NULL, IDI_APPLICATION); /* use the name "A" to use the project icon */

        if(!RegisterClassEx(&wc)) {
            MessageBox(NULL, "Window Registration Failed!","Error!",MB_ICONEXCLAMATION|MB_OK);
            return 0;
        }

        hwnd = CreateWindowEx(WS_EX_CLIENTEDGE,"WindowClass","Lines",WS_VISIBLE|WS_OVERLAPPEDWINDOW,
            CW_USEDEFAULT, /* x */
            CW_USEDEFAULT, /* y */
            640, /* width */
            480, /* height */
            NULL,NULL,hInstance,NULL);

        if(hwnd == NULL) {
            MessageBox(NULL, "Window Creation Failed!","Error!",MB_ICONEXCLAMATION|MB_OK);
            return 0;
        }

        /*
            This is the heart of our program where all input is processed and 
            sent to WndProc. Note that GetMessage blocks code flow until it receives something, so
            this loop will not produce unreasonably high CPU usage
        */
        while(GetMessage(&msg, NULL, 0, 0) > 0) { /* If no error is received... */
            TranslateMessage(&msg); /* Translate key codes to chars if present */
            DispatchMessage(&msg); /* Send it to WndProc */
        }

        return msg.wParam;
    }

编译器日志:

  • C++ 编译器:C:\Program Files (x86)\Dev-Cpp\MinGW64\bin\g++.exe
  • 命令:g++.exe "C:\Users\Pall\Desktop\proj1\lines.cpp" -o "C:\Users\Pall\Desktop\proj1\lines.exe" -g3 -I"C:\程序文件 (x86)\Dev-Cpp\MinGW64\include" -I"C:\Program Files (x86)\Dev-Cpp\MinGW64\x86_64-w64-mingw32\include" -I"C:\Program Files (x86 )\Dev-Cpp\MinGW64\lib\gcc\x86_64-w64-mingw32\4.8.1\include"-I"C:\Program Files (x86)\Dev-Cpp\MinGW64\lib\gcc\x86_64-w64- mingw32\4.8.1\include\c++" -L"C:\Program Files (x86)\Dev-Cpp\MinGW64\lib" -L"C:\Program Files (x86)\Dev-Cpp\MinGW64\x86_64- w64-mingw32\lib" -static-libgcc -g3 C:\Users\Pall\AppData\Local\Temp\ccRYW3Cy.o:在函数 DrawLine(int, int, int, int, HPEN__*)': C:/Users/Pall/Desktop/proj1/lines.cpp:12: undefined reference to__imp_SelectObject' C:/Users/Pall/Desktop/proj1/lines.cpp:13: 未定义引用__imp_MoveToEx' C:/Users/Pall/Desktop/proj1/lines.cpp:14: undefined reference to__imp_LineTo' C:\Users\Pall\AppData\Local\Temp\ccRYW3Cy.o:在函数WndProc(HWND__*, unsigned int, unsigned long long, long long)': C:/Users/Pall/Desktop/proj1/lines.cpp:36: undefined reference to__imp_CreatePen' collect2.exe:错误:ld 返回 1 个退出状态

【问题讨论】:

  • 我尝试重新安装 IDE 并搜索了问题,但没有任何帮助。
  • 您是否尝试阅读错误?链接因未定义的引用而失败。例如,__imp_MoveToEx 在哪里?
  • 我已经读过了... MoveToEx(hDC,x1,y1,NULL); //---第13行
  • 这就是你所说的。你的程序编译正常。它失败了,因为您没有将它与包含代码的库链接。
  • 在西班牙无敌舰队启航之前一切正常。

标签: c++ winapi gcc


【解决方案1】:

这是因为你需要链接库libgdi32.a,如果你使用的是DevC++,点击Tools->Compiler Options,打开窗口时,勾选“Add these commands to the linker command line”并在下面的文本框中添加文本:

-lgdi32

你的表格需要是这样的:

【讨论】:

  • 谢谢它的工作,但为什么它打开控制台窗口?
  • @DireDuke 默认情况下控制台已启用,要禁用,请单击工具->编译器选项并转到设置选项卡页面,选择链接器并在“不创建控制台窗口”选项中设置为是.您还可以隐藏调用函数 FreeWindow() 的控制台
  • 谢谢,你帮了我很多。
猜你喜欢
  • 1970-01-01
  • 2016-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-05
  • 1970-01-01
  • 1970-01-01
  • 2020-02-07
相关资源
最近更新 更多