一个makefile如下,我看不懂,请高手帮忙解释一下,谢谢!#
# Chapter 5 - Makefile
#
#
# Flags - Always compiles debug.
#
CPP_FLAGS=/c /MTd /Zi /Od /D_DEBUG
EXE_LINK_FLAGS=/DEBUG
DLL_LINK_FLAGS=/DLL /DEBUGLIBS=UUID.lib#################################################
#
# Targets
#
all : clients componentsclients : Client1.exe Client2.exe Client3.execomponents : Cmpnt1.dll Cmpnt2.dll Cmpnt3.dll 
   #################################################
#
# Shared source files
#GUIDs.obj : GUIDs.cpp 
cl $(CPP_FLAGS) GUIDs.cpp#################################################
#
# Component source files
#Cmpnt1.obj : Cmpnt1.cpp Iface.h
cl $(CPP_FLAGS) Cmpnt1.cppCmpnt2.obj : Cmpnt2.cpp Iface.h
cl $(CPP_FLAGS) Cmpnt2.cppCmpnt3.obj : Cmpnt3.cpp Iface.h
cl $(CPP_FLAGS) Cmpnt3.cpp
#################################################
#
# Client source files
## Shared File
Create.obj : Create.cpp Create.h
cl $(CPP_FLAGS) Create.cppClient1.obj : Client1.cpp Iface.h Create.h
cl $(CPP_FLAGS) Client1.cppClient2.obj : Client2.cpp Iface.h Create.h
cl $(CPP_FLAGS) Client2.cppClient3.obj : Client3.cpp Iface.h Create.h
cl $(CPP_FLAGS) Client3.cpp#################################################
#
# Link components.
#Cmpnt1.dll : Cmpnt1.obj GUIDs.obj Cmpnt1.def 
link $(DLL_LINK_FLAGS) Cmpnt1.obj GUIDs.obj $(LIBS) /DEF:Cmpnt1.def Cmpnt2.dll : Cmpnt2.obj GUIDs.obj Cmpnt2.def 
link $(DLL_LINK_FLAGS) Cmpnt2.obj GUIDs.obj $(LIBS) /DEF:Cmpnt2.def Cmpnt3.dll : Cmpnt3.obj GUIDs.obj Cmpnt3.def 
link $(DLL_LINK_FLAGS) Cmpnt3.obj GUIDs.obj $(LIBS) /DEF:Cmpnt3.def #################################################
#
# Link clients.
#Client1.exe : Client1.obj Create.obj GUIDs.obj
link $(EXE_LINK_FLAGS) Client1.obj Create.obj GUIDs.obj $(LIBS)Client2.exe : Client2.obj Create.obj GUIDs.obj
link $(EXE_LINK_FLAGS) Client2.obj Create.obj GUIDs.obj $(LIBS)Client3.exe : Client3.obj Create.obj GUIDs.obj
link $(EXE_LINK_FLAGS) Client3.obj Create.obj GUIDs.obj $(LIBS)

解决方案 »

  1.   

    1. 编译
    Cmpnt1.obj : Cmpnt1.cpp Iface.h
    cl $(CPP_FLAGS) Cmpnt1.cpp
    obj文件依赖Cmpnt1.cpp IFace.h,通过编译Cmpnt1.cpp生成,编译的过程把头文件Iface.h引入。
    2. 链接
    Cmpnt1.dll : Cmpnt1.obj GUIDs.obj Cmpnt1.def 
    link $(DLL_LINK_FLAGS) Cmpnt1.obj GUIDs.obj $(LIBS) /DEF:Cmpnt1.def 
    通过链接对象文件和def文件生成dll
    3. 链接
    Client3.exe : Client3.obj Create.obj GUIDs.obj
    link $(EXE_LINK_FLAGS) Client3.obj Create.obj GUIDs.obj $(LIBS)
    通过链接对象文件和库文件生成exe
      

  2.   

    cl.exe 
    link.exe
    是编译器命令行工具
      

  3.   

    CPP_FLAGS=/c /MTd /Zi /Od /D_DEBUG 
    // 编译选项 具体的差 msdn 应该是debug 版本,输出调试符号 多线程 需要连接 msvctxx.dl, 忘了,自己查 msdnCmpnt1.obj : Cmpnt1.cpp Iface.h
    cl $(CPP_FLAGS) Cmpnt1.cpp //是 makefile 的规则, cl 编译参数 cc.cpp 文件, 目的是 将其编译成 coff 格式的 .obj 文件, 只检查一般的语法错误 Cmpnt1.dll : Cmpnt1.obj GUIDs.obj Cmpnt1.def 
    link $(DLL_LINK_FLAGS) Cmpnt1.obj GUIDs.obj $(LIBS) /DEF:Cmpnt1.def 
    // 将 具体的 obj 按 xx.def 规定的连接成  dll ,检查声明的函数是否实行Client3.exe : Client3.obj Create.obj GUIDs.obj
    link $(EXE_LINK_FLAGS) Client3.obj Create.obj GUIDs.obj $(LIBS) 
    // ....可以参考 
    http://blog.csdn.net/newkey007/archive/2004/10/19/142324.aspx

    http://blog.csdn.net/newkey007/archive/2004/10/24/149835.aspx