微软的东西都很好用,特别是Virtual Studio 这套开发环境,让程序员最大限度的把精力集中在代码上,而不是花太多的功夫来配置编译环境,了解编译器特性,你只用建个工程写几行代码,然后F5 程序就以调试方式运行了,非常方便。但如果哪一天离开了VS ,我们能否写出同样的程序呢?总是听前辈讲不要依赖于具体环境、不要依赖于具体语言,他们都只是工具,重要的是思想,那么好吧,今天我们就通过Makefile 的方式来体会一下编译的思想。
言归正传,首先说一下需要的工具。打开< 你的安装位置>/Microsoft Visual Studio 9.0/VC/bin 目录,看到一堆可执行程序,只解释我们要用的:
cl.exe :C/C++ 编译器,通常在VC 环境中的“编译”选项执行的程序,会生成一堆OBJ 文件
link.exe :连接器,编译后需要连接程序把各个OBJ 文件连接成最终的可执行程序
nmake.exe :make 工具,就是它将要执行我们的Makefile 文件
好了介绍完所用工具,下面开始。
第一步:搭建环境,将下面代码保存成一个BAT 文件,我的是var.bat ,便于一次性配置好编译环境:
@echo off
set INCLUDE=< 你的安装位置>/Microsoft Visual Studio 9.0/VC/include;< 你的安装位置>/Microsoft SDKs/Windows/v6.0A/Include
set LIB=< 你的安装位置>/Microsoft Visual Studio 9.0/VC/lib;< 你的安装位置>/Microsoft SDKs/Windows/v6.0A/Lib
set PATH=< 你的安装位置>/Microsoft Visual Studio 9.0/VC/bin;< 你的安装位置>/Microsoft Visual Studio 9.0/Common7/IDE;%path%
echo on
第二步:环境设置完毕,现在写一个简单的Windows 窗口程序,只有一个文件main.cpp :
- //! filename: main.cpp
- #include <windows.h>
- int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
- {
- MessageBox(NULL, L"Hello Kent!" , L "Makefile Test" , MB_OK);
- return (0);
- }
- //! main.cpp end
第三步:主角Makefile 文件:
#My Makefile
#可执行文件名字
NAME = test
#需要的OBJ文件
OBJ = main.obj
#编译器参数,/c:只编译不连接 /D:定义宏 /Gd:指定使用__cdecl的函数调用规则
CL_FLAGS = /c /D "_UNICODE" /D "UNICODE" /Gd
#连接器参数,/OUT:后面是输出的可执行文件路径和文件名,
#再后面是需要的库文件,因为这里只用了MessageBox()函数所以只用加User32.lib库
#这个要根据自己具体应用修改,或者把VC中连接器命令行里显示的库名全写上以后就省事了
LINK_FLAGS = /OUT:$(NAME).exe User32.lib
#生成可执行文件规则
$(NAME).exe:$(OBJ)
link $(LINK_FLAGS) $(OBJ)
#生成OBJ文件规则
.cpp.obj:
cl $(CL_FLAGS) $<
#清理生成的临时文件
clean:
del *.obj
#Makefile end
第四步:执行Makefile 文件生成程序:
命令行下切换到var.bat 所在目录输入var 执行环境配置
切换到main.cpp 和Makefile 文件所在目录输入nmake 执行Makefile
好了,现在应该是已经生成了一个叫test.exe 的可执行文件,双击运行会出现一个对话框。这里只演示了一个简单的例子,但是后面的路已经有方向了。