抛开IDE编译程序

来源:互联网 发布:淘宝假鞋店铺 编辑:程序博客网 时间:2024/06/06 18:49
题目:抛开IDE编译程序
作者:vbcs
来自:http://hi.baidu.com/vbcs003

不知道大家在去一下开源站点上下载程序的时候当打开下载下来的程序的程序的时候,你们很奇怪的
发现里面没有我们想要的工程文件(一般指VC的工程文件)或者是C语言的,这时如果我们想编译的时候就
会感觉无从下手,但是大家没有没注意过里面一般会有一个相应的makefile文件,所以这就是问题的关键了。
下面我就来告诉大家如果来不用VC的IDE编译我们的工程文件。在此首先要来感谢一下看雪的一位老大的文章
(http://bbs.pediy.com/showthread.php?t=56912)
这里面讲得很详细了,我就不说其它的一些话了,直接来说一下如果来用makefile+nmake来编译VC的工程。
大家应该都知道在VC下的编译程序是CL.exe,链接程序是LINK.EXE如果不相信的话,可以到你的VC安装目录下
(..\vc98\bin\)去找到这两个文件然后把这两个文件改一下名字,再打开个文件编译一下,看一下结果你就知道
了。但是今天我所把说的makefile如果于它们没有直接的关于,和makefile直接打交道的应该是同一目录下的另一个
程序nmake这个程序,它用来分析makefile文件,关于nmake

语法:NMAKE [options] [macros] [targets] [@commandfile]
说明:其中,options是NMAKE的选项,macros是在命令行中的宏定义,targets是NMAKE的目标文件列表,commandfile是包含命令行输入的文本文件(或响应文件)。 
NMAKE 使用指定 /F 选项的Makefile(生成文件,通常名字是makefile);如果未指定 /F 选项,则使用当前目录下的Makefile。如果未指定Makefile,
则 NMAKE 使用推理规则生成命令行 targets。 
NMake本身很简单,与NMAKE配合的是Makefile。Makefile的语法比较复杂,通常需要开发者自己手动编写Makefile.

但是这个nmake是于VC的IDE没有关系的,也就是说VC IDE的编译是不依赖于NMAKE的,如不信可以把nmake文件名字
改一下试试。
下面开始了:
首先来配置一下你的../vc98/bin到环境变量。
在你的(C:\NMAKE\)磁盘上创建相应目录,我在根目录下创建这个可以随便,我是为了方便。
VC下的程序编译主要是两类一个是console,win32的,这两种相对于第二种前一种还要简单些。


控制台程序:
demo.cpp
#include"windows.h"
#include"stdio.h"
int main(void)
{
 getchar();
 return 0;
}
相应的makefile:

# makefile的注释是以#号开始
NAME = demo #你的文件的名子
OBJS = $(NAME).obj#要形成的OBJ文件

#链接参数
LINK_FLAG =/DEBUGTYPE:COFF /DEF $(NAME).def /OUT:$(NAME).exe /MAP:$(NAME).MAP  /PDB:$(NAME).pdb  /subsystem:console /DEBUG
# kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib  kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept 这是MS的参数
#编译参数
ML_FLAG =/Od /G5 /Gz /GA 
# /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c 这是MS的参数
#输出参数
OutPut_FLAG= /Fm:$(NAME).map 

$(NAME).exe: $(OBJS)
    link  $(LINK_FLAG) $(OBJS)

$(OBJS): $(NAME).cpp
    cl   $(OutPut_FLAG) $(NAME).cpp
    

把这两个文件放到同一个目录下,在命令行下到这个目录,执行nmake命令,如果成功的话会给你指示。
NAME = 2

OBJS = $(NAME).obj

LINK_FLAG = /subsystem:windows  /DEBUG
#/nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept MS的参数

ML_FLAG = /MT /GD /c
#/nologo /MD /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_AFXDLL"  /FD /c MS的参娄

$(NAME).exe: $(OBJS) $(NAME).res
    link $(LINK_FLAG) $(OBJS) 2dlg.obj stdafx.obj $(NAME).res

$(OBJS): $(NAME).cpp 2dlg.cpp stdafx.cpp
  cl $(ML_FLAG) $(NAME).cpp 2dlg.cpp stdafx.cpp
  
$(NAME).res:$(NAME).rc
  rc $(NAME).rc
  
其实他和上面的类似,只是在参数上有些复杂了。如果参数设置不当的话会出现下面这样的问题以及类似的错误提示
libcmt.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
2.exe : fatal error LNK1120: 1 unresolved externals
NMAKE : fatal error U1077: 'link' : return code '0x460'
Stop.

由于时间的原因我只是给大家说清楚有这会事就行了,如果大家想再深入一步学习的话,那就还要自己更深入的学习和到网上去
找更多的资料。
我的资料都来自网络和MSDN。上面我提到的关于MS的参数大家是从VC的工程文件的*.DSP中看到的,大家可以用文本编辑器打开看一下。
MS设置的参数。
关于makefile的制做方法,大家可以到上面我提到的链接上去下载一下。里面有附件可供下载。

其中关于cl,link,rc nmake的相关用法我它们的参数的意思可以直接在命令行下输入/?来得到HELP信息。
在此再次感谢网络和那些有无私精神的同行位。


原创粉丝点击