用NMAKE创建VS2012 C++工程三 自动编译所有的cpp文件
2013-08-28 11:27
447 查看
在step2的基础上,继续改进
1. 需要检测如果所需目录不存在,能够自动创建之
因为git commit会略过空目录,如果下次从别的机器上git clone这个项目的时候,bin, obj这些目录是不存在的。
使用@if not exist判断,用mkdir 创建目录
2. 需要一个clean pseudotarget用来删除不需要的目录,让项目还原到刚clone下来的状态
使用@if exit判断,用rmdir /S /Q 删除目录
3. 我还需要在build的时候显示一些信息
用@echo
4. 我不想每个cpp文件都写一个description block用来编译成obj文件,太傻了。
改进后的makefile如下:
INCLUDE_DIR = ..\include
OBJ_DIR_X86 = ..\obj_x86
BIN_DIR_X86 = ..\bin_x86
SRC_DIR = ..\src
EXE_NAME = step.exe
OBJ_FILES = \
$(OBJ_DIR_X86)\main.obj \
$(OBJ_DIR_X86)\printer.obj
{$(SRC_DIR)}.cpp{$(OBJ_DIR_X86)}.obj::
@echo Compiling...
cl /c /EHsc /Fo$(OBJ_DIR_X86)\ /I$(INCLUDE_DIR) $<
$(EXE_NAME): $(OBJ_DIR_X86)\*.obj
link /out:$(BIN_DIR_X86)\$(EXE_NAME) $(OBJ_FILES)
all: clean create_dirs $(EXE_NAME)
clean:
@echo "remove folders"
@if exist $(BIN_DIR_X86) rmdir /S /Q $(BIN_DIR_X86)
@if exist $(OBJ_DIR_X86) rmdir /S /Q $(OBJ_DIR_X86)
create_dirs:
@echo "create folders"
@if not exist $(BIN_DIR_X86) mkdir $(BIN_DIR_X86)
@if not exist $(OBJ_DIR_X86) mkdir $(OBJ_DIR_X86)
当运行nmake all的时候,会依次运行clean, create-dirs和 $(EXE_NAME),而下面这段代替了原来手动的配置每一个.cpp编译规则。使用了inference rule,参考文档:
http://msdn.microsoft.com/en-us/library/4hxwz9ch.aspx, 而且应该使用了batch mode rules.
http://msdn.microsoft.com/en-us/library/f2x0zs74.aspx
{$(SRC_DIR)}.cpp{$(OBJ_DIR_X86)}.obj::
@echo Compiling...
cl /c /EHsc /Fo$(OBJ_DIR_X86)\ /I$(INCLUDE_DIR) $<并且也没有了copy命令,因为/Fo可以保证obj文件被生成到指定目录。
$< 是必须要用的,删除掉就会报错。
The batch-mode inference rule must use $< as the macro to access dependent files.
1. 需要检测如果所需目录不存在,能够自动创建之
因为git commit会略过空目录,如果下次从别的机器上git clone这个项目的时候,bin, obj这些目录是不存在的。
使用@if not exist判断,用mkdir 创建目录
2. 需要一个clean pseudotarget用来删除不需要的目录,让项目还原到刚clone下来的状态
使用@if exit判断,用rmdir /S /Q 删除目录
3. 我还需要在build的时候显示一些信息
用@echo
4. 我不想每个cpp文件都写一个description block用来编译成obj文件,太傻了。
改进后的makefile如下:
INCLUDE_DIR = ..\include
OBJ_DIR_X86 = ..\obj_x86
BIN_DIR_X86 = ..\bin_x86
SRC_DIR = ..\src
EXE_NAME = step.exe
OBJ_FILES = \
$(OBJ_DIR_X86)\main.obj \
$(OBJ_DIR_X86)\printer.obj
{$(SRC_DIR)}.cpp{$(OBJ_DIR_X86)}.obj::
@echo Compiling...
cl /c /EHsc /Fo$(OBJ_DIR_X86)\ /I$(INCLUDE_DIR) $<
$(EXE_NAME): $(OBJ_DIR_X86)\*.obj
link /out:$(BIN_DIR_X86)\$(EXE_NAME) $(OBJ_FILES)
all: clean create_dirs $(EXE_NAME)
clean:
@echo "remove folders"
@if exist $(BIN_DIR_X86) rmdir /S /Q $(BIN_DIR_X86)
@if exist $(OBJ_DIR_X86) rmdir /S /Q $(OBJ_DIR_X86)
create_dirs:
@echo "create folders"
@if not exist $(BIN_DIR_X86) mkdir $(BIN_DIR_X86)
@if not exist $(OBJ_DIR_X86) mkdir $(OBJ_DIR_X86)
当运行nmake all的时候,会依次运行clean, create-dirs和 $(EXE_NAME),而下面这段代替了原来手动的配置每一个.cpp编译规则。使用了inference rule,参考文档:
http://msdn.microsoft.com/en-us/library/4hxwz9ch.aspx, 而且应该使用了batch mode rules.
http://msdn.microsoft.com/en-us/library/f2x0zs74.aspx
{$(SRC_DIR)}.cpp{$(OBJ_DIR_X86)}.obj::
@echo Compiling...
cl /c /EHsc /Fo$(OBJ_DIR_X86)\ /I$(INCLUDE_DIR) $<并且也没有了copy命令,因为/Fo可以保证obj文件被生成到指定目录。
$< 是必须要用的,删除掉就会报错。
The batch-mode inference rule must use $< as the macro to access dependent files.
相关文章推荐
- 如何在安卓环境下自动编译所有cpp文件
- 用NMAKE创建VS2012 C++工程 HelloWorld
- 编译cocos2d c++工程报错 build-binary.mk:589: obj/local/armeabi/libcocos2dcpp.so] Error 1 cpp自动导入Android.
- 用NMAKE创建VS2012 C++工程二 创建目录结构
- 用NMAKE创建VS2012 C++工程一 HelloWorld
- 编译cocos2dx工程,生成libcocos2dcpp.so文件失败
- mac下使用vim gcc/g++ 编译cpp(c++)文件并运行
- vs2012创建或打开浏览数据库文件.sdf文件失败,intellisense不能用于c++项目,F12 不能跳转到定义处
- 关于自动编译iOS工程,生成app及ipa文件的方法-备
- Cocos-X创建JS工程,编译Android .apk包,加载nanolink.so文件,创建一个实时对战游戏
- eclipse不能自动将java文件编译成class文件,刷新(Refrelsh)和重新建立工程都不行。
- 第五十七篇:VS2015建立一个完整的c++工程:头文件.h 源文件.cpp,自动生成类
- QT跨目录编译及多工程集成(动态库的创建、引用及工程间相互依赖关系的pro文件编写方法)
- C++编写查文件路径并创建所有目录程序
- 解决VS2010创建工程时弹出“创建或打开C++浏览数据库文件 发生错误”的问题"
- 批处理解决实际问题1——将目录下所有文件(*.cpp)分别创建同名文件夹并移入其中
- c++头文件,cpp文件,makefile,unit test自动生成器
- 工程管理之makefile与自动创建makefile文件过程
- cocos2dx 自动添加所有cpp文件到android.mk
- ros_fuerte创建工作空间、创建ROS功能包、编译ROS功能包、创建节点(cpp)、编译节点、使用launch文件、创建srv和msg文件、使用新建的srv和msg文件