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编辑过]









