VC命令行编译开源代码的常用做法
来源:互联网 发布:javascript 书 推荐 编辑:程序博客网 时间:2024/06/06 02:25
作者:朱金灿
来源:http://blog.csdn.net/clever101
一般开源代码为了支持多种编译器,一般并不针对VC编译器提供解决方案文件或工程文件。因此要使用VC编译器编译开源代码,需要了解VC命令行的常用用法以及开源代码编译方面的知识。
开源代码一般采用两种做法来支持VC编译器,一是用CMake导出VC++项目文件,如OpenCV和OSG这类库是采用这种做法。这类做法比较傻瓜式,一般使用CMake的图形工具就行,可以参考这篇文章OpenCV之一安装和环境变量配置,这里就不做详述。
开源代码更多是采用第二种方式——makefile文件的方式来支持VC编译器。下面我以编译著名的gdal库来说明如何使用简单的makefile来编译开源代码。
首先我们下载gdal的最新源码gdal-1.9.1,解压后在其根目录下找到makefile文件——makefile.vc,使用文本文件编辑器打开看看。现摘录其中一部分作一个简单解释:
- GDAL_ROOT = .
- !INCLUDE nmake.opt
- ##############################################################################
- # We need to add vb6 support if STDCALL is defined.
- !IF DEFINED(STDCALL) && $(MSVC_VER) < 1500
- VB6_OBJ = vb6\vb6_support.obj
- VB6_TARGET = vb6_dir
- !ENDIF
现简单解释下:
GDAL_ROOT = . 是说当前目录(就是makefile.vc所在的目录)是gdal的根目录,你还记得dos命令吗?.表示当前目录,..表示上一级目录
!INCLUDE nmake.opt就是说包含nmake.opt这个编译选项文件。nmake.opt文件下面会详述。
# 开头的表示后面的是注释内容。
!IF DEFINED(STDCALL) && $(MSVC_VER) < 1500
VB6_OBJ = vb6\vb6_support.obj
VB6_TARGET = vb6_dir
!ENDIF
就是说假如定义了STDCALL和VC的版本低于VC9.0 ($(MSVC_VER) < 1500), VB6_OBJ指向的路径为vb6\vb6_support.obj,VB6_TARGET指向的路径为vb6_dir。
我们再看看makefile的命令分支部分:
- clean:
- cd port
- $(MAKE) /f makefile.vc clean
- cd ..
- cd gcore
- $(MAKE) /f makefile.vc clean
- cd ..
- cd alg
- $(MAKE) /f makefile.vc clean
- cd ..
- cd frmts
- $(MAKE) /f makefile.vc clean
- cd ..
- cd ogr
- $(MAKE) /f makefile.vc allclean
- cd ..
- cd apps
- $(MAKE) /f makefile.vc clean
- cd ..
- cd swig
- $(MAKE) /f makefile.vc clean
- cd ..
- cd vb6
- $(MAKE) /f makefile.vc clean
- cd ..
- if exist gdal.lib del gdal.lib
- if exist $(GDAL_DLL) del $(GDAL_DLL)
- if exist $(GDAL_DLL).manifest del $(GDAL_DLL).manifest
- if exist gdal_i.lib del gdal_i.*
- -del *.ilk
- -del *.pdb
这一部分看似很复杂,实际上其作用只有一个,就是删除所有编译生成的中间文件和目标文件。
你看,makefile并不像想象中那么难,只要你愿意,它是可以理解的。!IF和!ENDIF是不是挺像C++的预编译指令呢?在我看来,makefile的主要语法就是C++的预编译指令和dos命令的混合体。
下面我们再详细了解下nmake.opt文件。打开gdal根目录下的nmake.opt文件,我们找到其中比较典型的部分进行分析。比如我们可以修改nmake.opt文件来使得gdal库集成prj4库。于是我们找到相应的部分:
- # PROJ.4 stuff
- # Uncomment the following lines to link PROJ.4 library statically. Otherwise
- # it will be linked dynamically during runtime.
- #PROJ_FLAGS = -DPROJ_STATIC
- #PROJ_INCLUDE = -Id:\projects\proj.4\src
- #PROJ_LIBRARY = d:\projects\proj.4\src\proj_i.lib
PROJ_FLAGS = -DPROJ_STATIC 是指打开该标记,就以静态链接的方式链接proj4库,不打开的话就以动态链接的方式来链接。PROJ_INCLUDE是指包含的prj4库的头文件,PROJ_LIBRARY是指包含的prj4库的库文件。注意包含头文件是-I+路径。这里的路径可以是绝对路径,也可以是相对路径,也支持环境变量,比如-I$(ORACLE_HOME)\oci\include。
讲了这么多,最后部分就是讲VC命令行使用makefile文件编译的最常用的命名吧(nmake都知道怎么打开吧,不是cmd哦):
- // 编译release版本的库
- nmake -f makefile.vc
- //删除所有编译生成的中间文件和目标文件
- nmake -f makefile.vc clean
- //编译debug版本的库
- nmake -f makefile.vc DEBUG=1
当然,如果你装有多个VisualStudio,还可以指定哪一个编译器编译:
- // 指定VS 2005编译
- nmake -f makefile.vc MSVC_VER=1400
MSVC_VER对应的VS版本为:
开源库的命名规则有个惯例,就是库名.lib一般是静态库,库名_i.lib一般是导入库,如gdal对应编译出来的静态库和导入库分别是gdal.lib和gdal_i.lib。
好了,希望下次当你打开一个开源代码,发现里面有makefile.vc文件,你就知道怎么编译了。
- VC命令行编译开源代码的常用做法
- VC命令行编译开源代码的常用做法
- vc 的命令行调试和编译
- vc 的命令行调试和编译
- VC工程的命令行编译法
- VC工程的命令行编译法
- VC工程的命令行编译法
- 命令行编译一个简单的 VC 程序
- 命令行编译vc工程
- VC命令行编译
- VC 命令行编译
- vc++ 命令行编译代码
- vc++命令行编译命令
- VC命令行编译
- VC命令行编译
- 命令行编译vc
- VC命令行编译(参数介绍)
- VC++ 2005 命令行编译参考
- Graphviz官方文檔
- 冒泡排序篇
- jquery设置页面自适应浏览器
- 写出高效的Bug测试报告的9点建议
- 联发科国内打败高通
- VC命令行编译开源代码的常用做法
- ABAP业务涉及到的相关数据库表 .
- 平台设备驱动手摘
- JSP调用request方法获取请求相关信息
- C# delegate和C# event
- php生成图片验证码
- android标题栏背景颜色
- 设计包含min函数的栈。
- 居安思危