博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
VC命令行编译开源代码的常用做法
阅读量:6258 次
发布时间:2019-06-22

本文共 2941 字,大约阅读时间需要 9 分钟。

作者:朱金灿

来源:

 

        一般开源代码为了支持多种编译器,一般并不针对VC编译器提供解决方案文件或工程文件。因此要使用VC编译器编译开源代码,需要了解VC命令行的常用用法以及开源代码编译方面的知识。

 

       开源代码一般采用两种做法来支持VC编译器,一是用CMake导出VC++项目文件,如OpenCV和OSG这类库是采用这种做法。这类做法比较傻瓜式,一般使用CMake的图形工具就行,可以参考这篇文章,这里就不做详述。

 

       开源代码更多是采用第二种方式——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) < 1500VB6_OBJ = vb6\vb6_support.objVB6_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文件,你就知道怎么编译了。

      如果你觉得我的博客对你有帮助,请在下面网址中博客之星评选活动投我一票:

(单击候选人介绍下面的投他一票那个按钮)
参与投票有机会获奖:
     最佳贡献奖:通过微博分享活动就有机会获得30元充值卡一张(每周抽选5名)
    幸运奖:凡参与投票用户就有机会获得精美小礼品一份。(每周抽选5名)
    积极参与奖:所有参与投票并符合条件的用户均可获得20个下载积分。

转载于:https://www.cnblogs.com/lanzhi/archive/2012/09/18/6470722.html

你可能感兴趣的文章
WEB架构师成长之路-架构师都要懂哪些知识 转
查看>>
C#中使用TCP通信
查看>>
Swift入门篇-swift简介
查看>>
05 继承
查看>>
弧度和角度的转换
查看>>
[leetcode]Unique Paths II @ Python
查看>>
nginx源码分析之hash的实现
查看>>
数据结构快速回顾——二叉树 解幂子集问题
查看>>
选择排序
查看>>
使用微软 URL Rewrite Module 开启IIS伪静态
查看>>
浅谈UML中类之间的五种关系及其在代码中的表现形式
查看>>
原创:CentOS6.4配置solr 4.7.2+IK分词器
查看>>
cocos2d(3.0)一些基础的东西
查看>>
jQuery动画animate方法使用介绍
查看>>
自适应网页设计(Responsive Web Design)
查看>>
[C#]Hosting Process (vshost.exe)
查看>>
spring beans源码解读之--bean definiton解析器
查看>>
mysql索引优化
查看>>
Async Performance: Understanding the Costs of Async and Await
查看>>
POJ3352Road Construction(构造双连通图)sdut2506完美网络
查看>>