VC6下不能连接出错,为什么?

flyingkoala 2002-07-12 12:56:11
generic.obj : error LNK2001: unresolved external symbol "int __stdcall InitInstance(void *,int)" (?InitInstance@@YGHPAXH@Z)
generic.obj : error LNK2001: unresolved external symbol "int __stdcall InitApplication(void *)" (?InitApplication@@YGHPAX@Z)
generic.exe : fatal error LNK1120: 2 unresolved externals

一个最简单的WINDOWS程序,就是在显示一个窗口,在程序里用了CALLBACK

编译的用法如下:
cl -c -W3 -Gz -D_X86_ -DWIN32 generic.cpp

LINK的用法如下:
link /MACHINE:I386 -subsystem:windows generic.res generic.obj libc.lib kernel32.lib user32.lib gdi32.lib

有什么不对吗?很着急
谢谢!
...全文
43 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
oustar 2002-07-12
  • 打赏
  • 举报
回复
你link的库太少了。
wiler 2002-07-12
  • 打赏
  • 举报
回复
我想你按向导做会什么事都没有
flyingkoala 2002-07-12
  • 打赏
  • 举报
回复
#include <WINDOWS.H>
#include "resource.h"
#include "generic.h"

HINSTANCE _hInst;
HWND _hWnd;

char _szAppName[] = "Generic";
char _szTitle[] = "Generic Sample Application";

//WinMain
int CALLBACK WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
MSG msg;

if(!hPrevInstance)
if(!InitApplication(hInstance))
return(FALSE);
if(!InitInstance(hInstance, nCmdShow))
return(FALSE);

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

return(msg.wParam);
}

//InitApplication
bool InitApplication(HINSTANCE hInstance)
{
WNDCLASS wc;

wc.style = CS_HREDRAW|CS_VREDRAW;
wc.lpfnWndProc = (WNDPROC)WndProc;
wc.cbClsExtra = 0;
wc.hInstance = hInstance;
//wc.hIcon = LoadIcon(hInstance,
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
//wc.hbrBackground = //GetStockObject(WHITE_BRUSH);
wc.lpszMenuName = "GenericMenu";
wc.lpszMenuName= "GenericMenu";
wc.lpszClassName = _szAppName;

return( RegisterClass(&wc));
}

//InitInstance ²úÉú´°¿Ú
bool InitInstance(HINSTANCE hInstance, int nCmdShow)
{
_hInst = hInstance;

_hWnd = CreateWindow(
_szAppName,
_szTitle,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL
);
if(!_hWnd)
return(FALSE);

ShowWindow(_hWnd, nCmdShow);
UpdateWindow(_hWnd);
return(TRUE);
}

//WndProc
LRESULT CALLBACK WndProc(HWND hWnd, UINT message,
WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;

switch(message){
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);

switch(wmId){
case IDM_ABOUT:
DialogBox(_hInst,
"AboutBox",
hWnd,
(DLGPROC)About
);
}
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return(DefWindowProc(hWnd, message, wParam, lParam));
}
return(0);
}

//About
LRESULT CALLBACK About(HWND hDlg, UINT message,
WPARAM wParam, LPARAM lParam)
{
switch(message){
case WM_INITDIALOG:
return(TRUE);
case WM_COMMAND:
if( LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL){
EndDialog(hDlg, TRUE);
return(TRUE);
}
break;
}
return(FALSE);
}
flyingkoala 2002-07-12
  • 打赏
  • 举报
回复
//程序是这样写的,能帮我看看吗?
//CL -c编译成.obj文件是没有错误,不过在连接的时候是不是只需要LIBC.LIB、KERNEL32.LIB、USER32.LIB、GDI32.LIB?
#include <WINDOWS.H>
#include "resource.h"
#include "generic.h"

HINSTANCE _hInst;
HWND _hWnd;

char _szAppName[] = "Generic";
char _szTitle[] = "Generic Sample Application";

//WinMain ³ÌÐòÈë¿Ú
int CALLBACK WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
MSG msg;

if(!hPrevInstance) //For a Win32-based application, this parameter is always NULL.
if(!InitApplication(hInstance))
return(FALSE);
if(!InitInstance(hInstance, nCmdShow))
return(FALSE);

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

return(msg.wParam);
}

//InitApplication ×¢²á´°¿ÚÀà
bool InitApplication(HINSTANCE hInstance)
{
WNDCLASS wc;

wc.style = CS_HREDRAW|CS_VREDRAW;
wc.lpfnWndProc = (WNDPROC)WndProc; //´°¿Úº¯Êý
wc.cbClsExtra = 0;
wc.hInstance = hInstance;
//wc.hIcon = LoadIcon(hInstance,
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
//wc.hbrBackground = //GetStockObject(WHITE_BRUSH);
wc.lpszMenuName = "GenericMenu"; //.rc¶¨ÒåµÄ²Ëµ¥
wc.lpszMenuName= "GenericMenu";
wc.lpszClassName = _szAppName;

return( RegisterClass(&wc));
}

//InitInstance ²úÉú´°¿Ú
bool InitInstance(HINSTANCE hInstance, int nCmdShow)
{
_hInst = hInstance; //´æ´¢ÎªÈ«¾Ö±äÁ¿£¬·½±ãʹÓÃ

_hWnd = CreateWindow(
_szAppName,
_szTitle,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL
);
if(!_hWnd)
return(FALSE);

ShowWindow(_hWnd, nCmdShow); //ÏÔʾ´°¿Ú
UpdateWindow(_hWnd);
return(TRUE);
}

//WndProc ´°¿Úº¯Êý
LRESULT CALLBACK WndProc(HWND hWnd, UINT message,
WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;

switch(message){
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);

switch(wmId){
case IDM_ABOUT:
DialogBox(_hInst,
"AboutBox", //¶Ô»°¿ò×ÊÔ´Ãû³Æ
hWnd, //¸¸´°¿Ú
(DLGPROC)About //¶Ô»°¿òº¯ÊýÃû³Æ
);
}
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return(DefWindowProc(hWnd, message, wParam, lParam));
}
return(0);
}

//About ¶Ô»°¿òº¯Êý
LRESULT CALLBACK About(HWND hDlg, UINT message,
WPARAM wParam, LPARAM lParam)
{
switch(message){
case WM_INITDIALOG:
return(TRUE); //TRUE±íʾÒѾ­´¦Àí¹ýÕâ¸öÏûÏ¢ÁË
case WM_COMMAND:
if( LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL){
EndDialog(hDlg, TRUE);
return(TRUE); //TRUE±íʾÒѾ­´¦Àí¹ýÕâ¸öÏûÏ¢ÁË
}
break;
}
return(FALSE);
}
flyingkoala 2002-07-12
  • 打赏
  • 举报
回复
to wiler(贼狼) :
我刚刚开始学WIN32 PROGRAMMING,是用NOTEPAD写的程序,连RESOURCE也是一句一句写,然后用RC编译的。
to oustar(欧文) :
对,我知道是LIB少了,不过试了很多都没有用。就是一个最简单的显示一个窗口,然后里面有一个菜单,还有一个ABOUT框。
还应该再加什么?
LIBC.LIB是C RUN TIME静态连接库,再加KERNEL32、USER32、GDI32还不够吗?谢谢

70,032

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧