CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
花落谁家,你作主! 盛大widget设计大赛英雄榜
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  基础类

make文件是怎么回事?

楼主wanghu(不懂就是不懂)2001-06-28 09:36:47 在 VC/MFC / 基础类 提问

我装有win2000pro和vc6  
  我在一个目录下执行make,可以系统说未找到此文件。path中已经设了.../vc98/bin乐。  
  问题点数:30、回复次数:4Top

1 楼z_sky()回复于 2001-06-28 09:43:01 得分 0

你要定义一个告诉make如何工作的makefile,类似于一个批命令文件,可语法是make的语法,可以很复杂。Top

2 楼smartboyme(淡泊明志,宁静致远)回复于 2001-06-28 09:47:49 得分 10

//抱歉,忘了作者了  
   
  Wisual   C++   Documentation->Using   Visual   C++->Visual   C++User's   Guide   ->Working   with   Projects   ->Overview   NMAKE   reference。  
  几乎所有的C/C++命令行工具里都有Make工具。Microsoft的叫做NMAKE,Borland的叫做Make。基本的语法都差不多。  
  举一个例子:  
  你开发一个最简单的Win32   Application.源文件如下:  
  //Generic.h  
  #ifndef   __GENERIC_H  
  #define   __GENERIC_H  
   
  #include   <windows.h>  
   
  #define   GENERICCLASS   "GenericClass"  
  #define   GENERICWINDOW   "Generic   Window"  
   
  LRESULT   CALLBACK   MainWndProc(HWND,UINT,WPARAM,LPARAM);  
  BOOL   CALLBACK   AboutProc(HWND,UINT,WPARAM,LPARAM);  
   
  #endif     /*__GENERIC_H*/  
   
  //Generic.C  
   
  #include   <windows.h>  
  #include   "Generic.h"  
  #include   "resource.h"  
   
  int   WINAPI   WinMain(HINSTANCE   hInstance,  
          HINSTANCE   hPrevInstance,  
          LPSTR   lpszCmdLine,  
          int   nCmdShow)  
  {  
          WNDCLASSEX   wcex;  
          HWND   hwnd;  
          MSG   msg;  
          wcex.cbSize=sizeof(wcex);  
          wcex.style=0;  
          wcex.lpfnWndProc=MainWndProc;  
          wcex.cbClsExtra=0;  
          wcex.cbWndExtra=0;  
          wcex.hInstance=hInstance;  
          wcex.hIcon=LoadIcon(NULL,IDI_APPLICATION);  
          wcex.hCursor=LoadCursor(NULL,IDC_ARROW);  
          wcex.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);  
          wcex.lpszMenuName=NULL;  
          wcex.lpszClassName=GENERICCLASS;  
          wcex.hIconSm=LoadIcon(NULL,IDI_APPLICATION);  
          if   (!RegisterClassEx(&wcex))  
          {  
                  return   FALSE;  
          }  
          hwnd=CreateWindowEx(0,  
                  GENERICCLASS,  
                  GENERICWINDOW,  
                  WS_OVERLAPPEDWINDOW,  
                  CW_USEDEFAULT,  
                  CW_USEDEFAULT,  
                  CW_USEDEFAULT,  
                  CW_USEDEFAULT,  
                  NULL,  
                  NULL,  
                  hInstance,  
                  NULL);  
          if   (!hwnd)  
          {  
                  return   FALSE;  
          }  
          ShowWindow(hwnd,nCmdShow);  
          while   (GetMessage(&msg,NULL,0,0))  
          {  
                  TranslateMessage(&msg);  
                  DispatchMessage(&msg);  
          }  
          return   msg.wParam;  
  }  
   
  LRESULT   CALLBACK   MainWndProc(HWND   hwnd,  
                                                            UINT   message,  
                                                            WPARAM   wp,  
                                                            LPARAM   lp)  
  {  
          static   HINSTANCE   hInstance;  
          static   HMENU   hMenu;  
          switch   (message)  
          {  
          case   WM_CREATE:  
          {  
                  hInstance=((LPCREATESTRUCT)lp)->hInstance;  
                  hMenu=LoadMenu(hInstance,(LPSTR)IDR_MAINMENU);  
                  SetMenu(hwnd,hMenu);  
          }  
                  return   0;  
          case   WM_COMMAND:  
          {  
                  switch   (LOWORD(wp))  
                  {  
                  case   IDM_EXIT:  
                  {  
                          char   lpszQueryQuit[32];  
                          char   lpszQueryQuitCaption[32];  
                          LoadString(hInstance,IDS_QUERYQUIT,lpszQueryQuit,32);  
                          LoadString(hInstance,IDS_QUERYQUITCAPTION,lpszQueryQuitCaption,32);  
                          if   (MessageBox(hwnd,lpszQueryQuit,lpszQueryQuitCaption,MB_YESNO)==IDYES)  
                          {  
                                  PostQuitMessage(0);  
                          }  
                  }  
                          return   0;  
                  case   IDM_ABOUT:  
                  {  
                          return   DialogBoxParam(hInstance,  
                                  (LPSTR)IDD_ABOUT,  
                                  hwnd,  
                                  AboutProc,  
                                  (LPARAM)hInstance);  
                  }  
                          return   0;  
                  default:  
                          break;  
                  }  
          }  
                  return   0;  
          case   WM_PAINT:  
          {  
                  PAINTSTRUCT   ps;  
                  HDC   hdc;  
                  RECT   rc;  
                  char   lpszHello[32];  
                  hdc=BeginPaint(hwnd,&ps);  
                  GetClientRect(hwnd,&rc);  
                  LoadString(hInstance,IDS_HELLO,lpszHello,32);  
                  DrawText(hdc,lpszHello,lstrlen(lpszHello),&rc,DT_CENTER);  
                  EndPaint(hwnd,&ps);  
          }  
                  return   0;  
          case   WM_DESTROY:  
          {  
                  PostQuitMessage(0);  
          }  
                  return   0;  
          default:  
                  break;  
          }  
          return   DefWindowProc(hwnd,message,wp,lp);  
  }  
   
  BOOL   CALLBACK   AboutProc(HWND   hwnd,UINT   message,WPARAM   wp,LPARAM   lp)  
  {  
          static   HINSTANCE   hInstance;  
          switch   (message)  
          {  
          case   WM_INITDIALOG:  
          {  
                  hInstance=(HINSTANCE)hInstance;  
          }  
                  return   TRUE;  
          case   WM_COMMAND:  
          {  
                  if   ((LOWORD(wp)==IDOK)||(LOWORD(wp)==IDCANCEL))  
                  {  
                          EndDialog(hwnd,0);  
                  }  
          }  
                  return   TRUE;  
          default:  
                  break;  
          }  
          return   FALSE;  
  }  
   
  //Generic.rc  
  #include   "resource.h"  
  #include   <windows.h>  
   
   
  /////////////////////////////////////////////////////////////////////////////  
  //  
  //   Dialog  
  //  
   
  IDD_ABOUT   DIALOG   DISCARDABLE     0,   0,   187,   69  
  STYLE   DS_MODALFRAME   |   WS_POPUP   |   WS_CAPTION   |   WS_SYSMENU  
  CAPTION   "Generic   Dialog"  
  FONT   10,   "System"  
  BEGIN  
          DEFPUSHBUTTON     "OK",IDOK,66,43,50,14  
          CTEXT                     "Generic   Window   32   bits   Application\nWriter   Tian   Wei",  
                                          IDC_STATIC,24,15,136,18  
  END  
   
   
  /////////////////////////////////////////////////////////////////////////////  
  //  
  //   Menu  
  //  
   
  IDR_MAINMENU   MENU   DISCARDABLE    
  BEGIN  
          POPUP   "&File"  
          BEGIN  
                  MENUITEM   "E&xit",                                             IDM_EXIT  
          END  
          POPUP   "&Help"  
          BEGIN  
                  MENUITEM   "&About",                                             IDM_ABOUT  
          END  
  END  
   
   
  /////////////////////////////////////////////////////////////////////////////  
  //  
  //   String   Table  
  //  
   
  STRINGTABLE   DISCARDABLE    
  BEGIN  
          IDS_QUERYQUIT                     "Do   you   really   want   to   quit?"  
          IDS_QUERYQUITCAPTION         "Confirm   quitting"  
          IDS_HELLO                             "Hello   world!"  
  END  
   
  //resource.h  
  #define   IDS_QUERYQUIT                                     1  
  #define   IDS_QUERYQUITCAPTION                         2  
  #define   IDS_HELLO                                             3  
  #define   IDD_ABOUT                                             101  
  #define   IDR_MAINMENU                                         102  
  #define   IDM_EXIT                                                 40001  
  #define   IDM_ABOUT                                             40002  
  #define   IDC_STATIC                                             -1  
   
  现在你写一个如下的generic.mak,用于Microsoft的命令行工具。  
  //generic.mak  
  mspath   =   d:\progra~1\micros~1\vc98   #这一行应该是你的VC的路径,不一定是我写的。  
  linkpath   =   $(mspath)\bin  
  cpath   =   $(mspath)\bin  
  rpath   =   $(mspath)\bin  
  cincpath   =   $(mspath)\include  
   
  cc   =   $(cpath)\cl.exe    
  cflags   =   -c   -I$(cincpath)    
   
  rincpath   =   $(cincpath)  
  rc   =   $(rpath)\rc.exe  
  rflags   =   -i$(rincpath)    
   
  libpath   =   $(mspath)\lib  
  link   =   $(linkpath)\link.exe  
  linkflags   =   -subsystem:windows   -libpath:$(libpath)  
   
  crtlibs   =   libc.lib  
   
  win32libs   =   kernel32.lib           user32.lib           gdi32.lib           uuid.lib           oldnames.lib           advapi32.lib           comctl32.lib           comdlg32.lib           shell32.lib           shlwapi.lib    
   
  comlibs   =   ole32.lib           oleaut32.lib           oledlg.lib    
   
  deflibs   =   $(crtlibs)   $(win32libs)   $(comlibs)  
   
  all:   generic.exe  
   
  generic.obj:   generic.c   generic.h   resource.h  
          $(cc)   $(cflags)   generic.c  
   
  generic.res:   generic.rc   resource.h  
          $(rc)   $(rflags)   generic.rc  
   
  generic.exe:   generic.obj   generic.res  
          $(link)   $(linkflags)   -out:generic.exe   generic.obj   generic.res   $(deflibs)  
   
  最后,可以在控制台方式下这样运行NMAKE:  
  namke   -f"Generic.mak"  
  当然,如果nmake的路径不再环境变量里,还要用全名。  
  最后就会产生generic.obj,generic.res,generic.exe三个文件。  
  如果用VC,那么在选择工程类型的时候要选择makefile,这样的话就可以正确的编译。  
   
  当然,你会觉得每次写这么复杂的makefile太累了。VC的Include目录里边有一个Win32.mak,里边定义好了编译和连接用到的标志,比如generic.mak可以这么写:  
   
  !include   <win32.mak>  
   
  all:   generic.exe  
   
  generic.obj:   generic.c   generic.h   resource.h  
          $(cc)   $(cdebug)   $(cflags)   $(cvars)   generic.c  
   
  generic.res:   generic.rc   resource.h  
          $(rc)   $(cdebug)   $(rcvars)   -r   -fo   generic.res   generic.rc  
   
  generic.exe  
          $(link)   $(linkdebug)   $(guiflags)   -out:generic.exe   generic.obj   generic.res   $(guilibs)  
   
  简单地说以#开头的是注释,以!开头的是一些控制语句,   比如!if   !else   !endif     !include等等。以$开头并且用括号包起来的是常量。常量必须先定义。比如cc   =   cl.exe就把cc定义成了cl.exe以后遇到$(cc)就会被扩展成cl.exe。  
  最重要的是依赖性。  
  以下  
  generic.obj:   generic.c   generic.h   resource.h  
          $(cc)   $(cdebug)   $(cflags)   $(cvars)   generic.c  
  表示generic.obj依赖generic.c   generic.h   resource.h三个文件。如果其中一个被改动过,那么generic.obj叫要被重新建立。建立的方法是$(cc)   $(cdebug)   $(cflags)   $(cvars)   generic.c。  
  all:   generic.exe表示最终的目标是generic.exe  
  Top

3 楼wanghu(不懂就是不懂)回复于 2001-06-28 09:50:30 得分 0

makefile已经有了。vc下此文件是否名为nmake?Top

4 楼plato(天天)回复于 2001-06-28 09:55:35 得分 20

vc下面也叫makefile。  
  nmake.exe是读取makefile并且执行的程序。  
   
  unix下面  
  make是读取makefile并且执行的程序。Top

相关问题

  • *.plg文件是怎么回事
  • .jse文件是怎么回事?
  • Config.Msi文件夹是怎么回事?
  • .jar文件是怎么回事,如何制作.jar文件?
  • 文件图标经常自己改动是怎么回事?
  • stdafx.h这个头文件究竟是怎么回事?
  • “源文件可能正被使用”到底是怎么回事?
  • 这是怎么回事,关于头文件?
  • 求救:WIN2000的文件保护是怎么回事
  • 打不开chm文件是怎么回事?

关键词

  • visual c++
  • win32
  • 文件
  • 语法
  • vc
  • ws
  • wcex
  • generic
  • mspath
  • cdebug

得分解答快速导航

  • 帖主:wanghu
  • smartboyme
  • plato

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo