标题:gcc链接WinMM.Lib问题
只看楼主
不懂才问
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:大草原
等 级:贵宾
威 望:29
帖 子:1501
专家分:6573
注 册:2010-7-5
结帖率:91.53%
已结贴  问题点数:100 回复次数:2 
gcc链接WinMM.Lib问题
程序代码:
//实例来源:圣经64页
//实例功能:
//运行结果描述:
#include <windows.h>
#pragma comment (lib,"WinMM.Lib")  //没啥反应呢,也不知道加载成功了还是失败了
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);

int WINAPI WinMain(HINSTANCE hInstance,
                    HINSTANCE hPrevInstance,
                    PSTR szCmdLine,
                    int iCmdShow){
    static TCHAR szAppName[]=TEXT("HelloWin");
    HWND hwnd;
    MSG msg;
    WNDCLASS wndclass;

    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;

    if (!RegisterClass(&wndclass)){
        MessageBox(NULL,TEXT("Windows NT"),
            szAppName,MB_ICONERROR);
        return 0;
    }

    hwnd=CreateWindow(szAppName,  //窗口类名称
                        TEXT("Window Caption"),  //窗口标题
                        WS_OVERLAPPEDWINDOW,  //窗口样式
                        CW_USEDEFAULT,  //初始左上角X坐标
                        CW_USEDEFAULT,  //初始左上角Y坐标
                        CW_USEDEFAULT,  //窗口初始宽度
                        CW_USEDEFAULT,  //窗口初始高度
                        NULL,  //父窗口句柄
                        NULL,  //窗口菜单句柄
                        hInstance,  //实例句柄
                        NULL);  //窗口创建时的参数

    ShowWindow(hwnd,iCmdShow);
    UpdateWindow(hwnd);

    while (GetMessage(&msg,NULL,0,0)){
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}

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

    switch (message){
    case WM_CREATE:
        PlaySound(TEXT("hellowin.wav"),NULL,SND_FILENAME|SND_ASYNC);  //有这个GCC编译不通过
        return 0;
    case WM_PAINT:
        hdc=BeginPaint(hwnd,&ps);
        GetClientRect(hwnd,&rect);
        DrawText(hdc,
            TEXT("Welcom Windows API!"),
            -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);
}


以上代码,在VS2008里可以编译运行,因为链接了winmm.lib,但我想用GCC编译试试,出现错误:
C:\Users\ADMINI~1\AppData\Local\Temp\ccdU3oZZ.o:test.c:(.text+0x7f): undefined reference to `__imp_GetStockObject'
C:\Users\ADMINI~1\AppData\Local\Temp\ccdU3oZZ.o:test.c:(.text+0x20a): undefined reference to `__imp_PlaySoundA'
collect2.exe: error: ld returned 1 exit status

找到另一本书里有个语句,可以链接时指定的做法。

程序代码:
//实例来源:《精通Windows API 范文庆、周彬彬、安靖著》16页
//实例功能:HelloWindowsAPI
//运行结果描述:加入了链接时指定User32.lib,需要保存为936代码页
#include <windows.h>
//链接时使用User32.lib  //我的注释:这句好像没起作用吧?都没指定到底链接哪个版本的User32.lib
#pragma comment (lib,"User32.lib")  //试了一下,果然有它没它都可以编译运行
int WinMain(  //与圣经和一般网上实例不同,没使用WINAPI那几个字
        HINSTANCE hInstance,
        HINSTANCE hPrevInstance,
        LPSTR lpCmdLine,  //与圣经不同处,圣经是PSTR,这里是LPSTR
        int nCmdShow){
    MessageBox(NULL,TEXT("开始学习Windows API编程"),TEXT("消息对话框"),MB_OK);
    return 0;  //与圣经不同,但与我的实际环境相同,return首字母不能大写
}


我搜索了C盘,User32.lib有四个,有x86、x64还有IA64的。第二个代码那句,链接的是哪个呢?

换成我的问题,要怎么在我第一段程序中,链接上x64位的WinMM.lib呢

还在百度上找到一种说法,在命令链接时加上参数-Iwinmm
https://zhidao.baidu.com/question/2117602199340331187.html

这种方法是不是要把winmm.lib拷贝到msys2相关的文件夹里面啊?

[此贴子已经被作者于2019-4-9 13:07编辑过]

搜索更多相关主题的帖子: 链接 Lib HWND TEXT NULL 
2019-04-09 12:38
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:100 
#pragma comment (lib,"WinMM.Lib")
这玩意儿是VC独有的,不是C/C++的标准语法。MinGW不认识它很正常

是不是要把winmm.lib拷贝到msys2相关的文件夹里面啊?
不需要拷,因为MinGW用的库中有 libwinmm.a
即使拷进去也没用,因为 MinGW 不认识 WinMM.Lib 的格式。

在命令链接时加上参数-Iwinmm
加 -mwindows  -lwinmm 试试

2019-04-09 13:56
不懂才问
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:大草原
等 级:贵宾
威 望:29
帖 子:1501
专家分:6573
注 册:2010-7-5
得分:0 



不提示就是最好的提示,谢谢rjsp

报告老师,我低头不是因为我在装低调,是你问的问题,我真的不会答,,,
2019-04-09 18:33



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-494027-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.190848 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved