Skip to content
rhcad edited this page Feb 23, 2012 · 19 revisions

Makefile 说明

软件安装和部分编译测试说明还可参考代码中的 INSTALL-win.txtINSTALL-unix.txt

一、变量说明(C++程序和插件)

常用重要变量

  • PROJNAME: 工程名,一般与实现文件所在文件夹同名。

  • PKGNAME: 包名,用于形成头文件包含路径和形成C#命名空间。工程源码目录一般为 source\$(PKGNAME)\$(PROJNAME)\,对外接口文件可放在 interface\$(PKGNAME)\$(PROJNAME)\interface\$(PKGNAME)\

  • APPTYPE: 当前工程是程序(不是动态库)时设置,可能的值有 console (控制台程序)、mfc (MFC窗口程序)、qt (QT窗口程序)。

  • INCLUDES: 用于编译C++文件的包含路径参数,每个路径以-I开头, 格式形如 -Ipath1 -Ipath2 -I"path with space",该参数将和$(CPPFLAGS)一起用于编译。PKGNAME 会自动加到 INCLUDES 中,如果工程还需要额外的包含路径,可以扩充到 INCLUDES ,例如 INCLUDES += -I$(INTERFACE_DIR)/otherpkg

  • LIBS: 用于链接的库文件路径和库文件的参数。每个库路径的格式为 $(LIBPATHFLAG)yourlibpath;每个库文件的格式为 $(LIBFLAG)$(LIBPRE)yourlibname$(LIBEND);如果是外部VC++库文件,则没有LIBPRE,格式为 $(LIBFLAG)yourlibname$(LIBEND) 或直接写为 yourlibname.lib

  • MOCS: QT模块中含有 Q_OBJECT和信号槽的头文件列表,在包含 Makefile.qt4 前定义,例如 MOCS = mainwnd.h mypanel.h

  • CPPFLAGS: 编译选项,和 INCLUDES 变量一起使用。

  • LDFLAGS: 链接选项,和 LIBS 变量一起使用。

VC++编译用的环境变量

如果需要使用VC++编译器进行编译,需要定义VCBIN环境变量、在Windows上安装Unix环境模拟软件 MSYS,还需要使用 GCC 进行文件依赖分析(生成.d文件,不需要GCC编译)。

如果在Win32平台编译时 cl.exe 报告找不到 mspdb80.dll 或 mspdb60.dll,则可以使用三种方法之一:1)将 cl.exe 所在的 bin 目录复制到另一个目录,将所缺的 mspdb80.dll 复制到这个新目录,然后将 VCBIN 设置为该目录;2)将这一个DLL复制到 cl.exe 所在目录(但会引起在VS IDE中编译错误,又得临时删掉);3)或者将将该DLL所在目录添加到 PATH 环境变量。在x64平台编译时没有该问题。

  • VCBIN

    VC++的cl.exe所在目录,末尾有反斜号,如果不设置该变量则使用GCC编译并忽略下面三个环境变量。
    下面是示例值(需要根据实际安装路径来定,末尾有分隔符):
    
    `D:\VS2008\VC\bin2\`   (VC90,我是复制VC\bin目录再放mspdb80.dll的)
    
    `C:\Program Files\Microsoft Visual Studio\VC98\Bin\`  (VC6)
    
  • VCINC

    VC++的包含路径,格式参见INCLUDES,不要包含VC++特殊编译选项(避免GCC依赖分析失败,VCINC会用于GCC),该变量将合并到 INCLUDES 变量中。
    下面是示例值(需要根据实际安装路径来定):
    
    `-I"D:\VS2008\VC\include" -I"D:\VS2008\VC\atlmfc\include"`  (VC90)
    
    `-I"C:\Program Files\Microsoft Visual Studio\VC98\Include"`  (VC6)
    
  • WINSDKINC

    Microsoft Windows SDK 的包含路径(用 VC2005或高版本时),格式参见INCLUDES。WINSDKINC不用于GCC依赖分析,*.rc 资源文件编译时也会用到。下面是示例值(需要根据实际安装路径来定):
    
    `-I"C:\Program Files\Microsoft SDKs\Windows\v6.0A\Include"`
    
  • VCFLAGS

    包含VC++特殊编译选项,每个选项以减号开头而不是以除号开头。VCFLAGS不用于GCC依赖分析。下面是示例值(需要根据实际安装路径来定):
    
    `-EHsc -MD -W3 -GR -DUNICODE`
    
  • VCLIBS

    VC++的库文件路径和链接选项的参数,将合并到 LIBS 变量中。该变量包含VC++特殊链接选项,每个选项以减号开头而不是以除号开头。
    下面是示例值(需要根据实际安装路径来定,例如64位编译时改为 `-MACHINE:X64`):
    
    `-machine:X86 -libpath:"D:\VS2008\VC\lib" -libpath:"D:\VS2008\VC\atlmfc\lib" -libpath:"C:\Program Files\Microsoft SDKs\Windows\v6.0A\Lib"`
    
    `-MACHINE:X86 -libpath:"C:\Program Files\Microsoft Visual Studio\VC98\Lib"`  (VC6)
    

自动形成的命令常量

  • CPP: 编译命令名。
  • LINK: 链接命令名。
  • AR: 打包为静态库文件的命令名。
  • ARFLAGS: 打包选项。

自动形成的辅助常量,兼容GCC和VC++

  • OUTFLAG: 用于替换 -o

  • LIBPATHFLAG: 用于替换 -L ,每个库路径的格式为 $(LIBPATHFLAG)yourlibpath

  • LIBFLAG: 用于替换 -l

  • LIBPRE: 与LIBFLAG一起使用,对外部VC++库文件则不需要LIBPRE。

  • LIBEND: 与LIBFLAG一起使用,每个库文件的格式为 $(LIBFLAG)$(LIBPRE)yourlibname$(LIBEND);如果是外部VC++库文件,则没有LIBPRE,格式为 $(LIBFLAG)yourlibname$(LIBEND) 或直接写为 yourlibname.lib

  • LIBEXT: 静态库后缀名

  • OBJEXT: 目标文件后缀名

  • APPEXT: 程序后缀名

其他C++环境变量

  • QTDIR: QT4 框架在 Windows 上的安装路径,Linux 上不需要设置。例如可能为 D:\Soft\Qt_4.8.1_VS2008,QT4在Windows上有VS2008和MinGW等发布版本,在Linux上可能已安装了QT4。

  • QT4_INCLUDE: QT4框架的包含路径,Windows 上不需要设置,其他操作系统下与config.mk中的默认值不同时可设置。

  • QT4_LIB: QT4框架的库文件路径,Windows 上不需要设置,其他操作系统下与config.mk中的默认值不同时可设置。

  • WINSDKBIN: 包含 rc.exe 的目录,用于资源文件 *.rc 的编译链接,末尾有反斜号。在 Windows 上Make时需要设置,或者将目录加入到 PATH 环境变量中。下面是示例值:

    `C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin\`
    

路径常量

  • ROOTDIR: 根 Makefile 文件所在的相对目录,该目录下有 config.mk 文件。

  • INTERFACE_DIR: 接口根目录

  • INSTALL_DIR: 最终输出文件的根目录,默认为 build 目录。

  • PLUGINS_DIR: 插件文件的输出目录,默认为 build/plugins 目录。

  • TARGET: 工程最终输出文件(动态库、静态库、程序)的文件名,带有路径,通常输出到 $(INSTALL_DIR) 目录或其子目录下,例如 $(PLUGINS_DIR)。程序的TARGET一般设置为 $(INSTALL_DIR)/$(PROJNAME)$(APPEXT) ,插件的TARGET一般设置为 $(PLUGINS_DIR)/$(PROJNAME).pln ,静态库的TARGET一般设置为 $(PLUGINS_DIR)/$(PROJNAME)$(LIBEXT)

  • SUBDIRS: 用于调用各个子文件夹下的 Makefile

  • SOURCES: 用于识别各个CPP文件

  • OBJS: 目标文件列表,从SOURCES推导而来

条件判断常量

  • OS: 所在操作系统类型
  • IS_WIN: 所在操作系统为 Windows 或未定义
  • IS_MACOSX: 所在操作系统为 Mac OS X 或未定义
  • IS_CONSOLE: 当前程序为控制台程序或未定义,在包含config.mk前加上 APPTYPE =console 来标识控制台程序
  • IS_LIB: 当前工程为静态库或未定义,在包含config.mk前加上 CPPFLAGS += -D_LIB 来标识静态库
  • IS_AFXDLL: 当前工程为MFC程序或MFC常规动态库时在包含config.mk前加上 CPPFLAGS += -D_AFXDLL 来标识,其他工程类型时此值未定义
  • IS_AFXEXT: 当前工程为MFC扩展动态库时在包含config.mk前加上 CPPFLAGS += -D_AFXDLL -D_AFXEXT 来标识,其他工程类型时此值未定义

二、变量说明(SWIG插件)

主要环境变量(Linux和MacOSX可能不需要设置)

要使用SWIG插件功能的话,必须安装 SWIG,并根据需要安装 PythonPerlJava、Ruby 等一种或多种开发包。在 Linux 和 Mac OS X 上可能已经安装了这些开发包,且可能不需要再配置环境变量。

  • SWIG_BIN: 包含 swig.exe 的目录,末尾有反斜号。在 Windows 上需要设置,或者将目录加入到 PATH 环境变量中。例如设置为 D:\Soft\swigwin-2.0.4\

  • PYTHON_INCLUDE: 包含 python.h 的目录。

  • PYTHON_LIB: 包含 Python 库文件的目录,在 Windows 上需要设置。例如设置为 D:\Soft\Python27x86\libs

  • PYTHON_LIBFILE: Python 库文件名,没有后缀名。由于 ActivePython 默认是用VC++编译的,因此如果使用该 Python 发行版时也需要使用VC++编译Python插件,例如使用 ActivePython 2.7 时该变量填写为 python27

  • PERL5_INCLUDE: 包含 perl.h 的目录。

  • PERL5_LIB: 包含 Perl 库文件的目录,在 Windows 上需要设置。例如设置为 D:\Soft\Perl\lib\CORE

  • PERL5_LIBFILE: Perl 库文件名,没有后缀名。

  • RUBY_INCLUDE: 包含 ruby.h 的目录。

  • RUBY_LIB: 包含 Ruby 库文件的目录,在 Windows 上需要设置。

  • RUBY_LIBFILE: Ruby 库文件名,没有后缀名。

  • JAVA_INCLUDE: 包含 jni.h 的目录。

  • JAVA_BIN: 包含 javac.exe 的目录,末尾有反斜号。在 Windows 上需要设置,或者将目录加入到 PATH 环境变量中。例如设置为 D:\Java\jdk1.6.0_29\bin\

  • CSC_BIN: 包含 csc.exe 的目录,用于 C# 编译,末尾有反斜号。在 Windows 上需要设置,或者将目录加入到 PATH 环境变量中。例如设为 C:\Windows\Microsoft.NET\Framework\v3.5\

自动形成的辅助常量

  • SWIG_TYPE: 在根 Makefile 文件中自动定义,例如执行 make python perl5 就自动定义并编译。
  • SWIG_INCLUDE: 当前扩展语言的包含目录
  • SWIG_LIBPATH: 当前扩展语言的库目录
  • SWIG_LIBFILE: 当前扩展语言的库文件名,没有后缀名和路径
  • SWIG_TESTEXT: 测试文件的后缀名
  • TESTFILE: 测试文件,以test开头,然后是工程名,例如 testmyproj.py
  • USE_PYTHON: 当前是编译Python扩展库,或未定义
  • USE_PERL: 当前是编译Perl扩展库,或未定义
  • USE_JAVA: 当前是编译Java扩展库,或未定义
  • USE_RUBY: 当前是编译Ruby扩展库,或未定义
  • SWIG_OUTDIR: SWIG插件动态库的输出目录,位于 $(INSTALL_DIR) 下
  • SWIG_CC: SWIG对.i接口文件的编译命令行
  • SWIG_PRE: SWIG插件动态库的前缀名,除Python插件为“_”前缀名外,其余语言的插件前缀名为空
  • SWIG_EXT: SWIG插件动态库的后缀名,例如 .pyd、.dll、.so
  • WRAPFILE: SWIG生成的CXX文件的文件名

三、make 编译说明

MSYS命令行编译的快捷方式

在Windows上用MinGW MSYS进行make时,每次都要进入特定的代码目录,下面介绍一种快捷方式。假设x3py的代码下载到 E:\x3py\ 下,则在MSYS的~目录下(<msys_setuppath>\home\<youruser>\)创建Makefile文件,其内容如下(@cd前为制表符):

SWIGS  =python perl5 java csharp ruby php lua r
CLEANSWIGS =$(addsuffix .clean, $(SWIGS))
.PHONY:	clean cleanall py $(SWIGS)

all clean cleanall py $(SWIGS) $(CLEANSWIGS):
	@cd e:; cd x3py; $(MAKE) $@

这样每次进入MSYS环境时,直接输入makemake all pymake clean就能立即编译。