目录

第1章 VC++6.0    1

1.1 设置依赖关系    1

1.2 编译顺序    2

1.3 自动连接    3

1.4 静态库    3

1.4.1 嵌入    3

1.4.2 替换    4

第2章 VC++2005    6

2.1 设置依赖关系    6

2.2 自动连接    7

2.2.1 链接库依赖项(Link Library Dependencies)    8

2.2.2 忽略导入库(Ignore Import Library)    9

2.3 静态库    9

第3章 VC++2010    10

3.1 引用工程    10

第1章 VC++6.0

一个VC++6.0项目(Workspace),可以由多个工程(Project)构成。如下图所示。此项目由App、Mod1、Mod2A、Mod2B四个工程组成。

图1.1

1.1 设置依赖关系

假定上图四个工程的依赖关系图如下所示。

图1.2

上图表示:Mod2A会调用Mod1里的某些函数,即Mod2A依赖于Mod1。总共有5个依赖关系。可以在VC++6.0里设置工程依赖关系,其操作如下:

单击【Project】【Dependencies...】菜单项

图1.3

显示界面如下

图1.4

上图表示工程App依赖于Mod1、Mod2A、Mod2B。可以更换App为Mod1、Mod2A、Mod2B,依次设置这些工程的依赖项。

1.2 编译顺序

设置了工程的依赖项,编译时编译器会自动编排编译顺序。编译某个工程前,确保其依赖项已经被编译。

如编译图1.2中的App时,编译器会首先编译好Mod1、Mod2A、Mod2B;而编译Mod2A或Mod2B之前,会首先编译好Mod1。最终的编译顺序就是:Mod1、Mod2A、Mod2B、App(Mod2A和Mod2B的编译顺序不是确定的,哪个先编译都可以)。

1.3 自动连接

设置了工程的依赖项,编译时编译器会自动连接依赖项。如图1.2中,连接App时,会自动连接Mod1.lib、Mod2A.lib、Mod2B.lib;连接Mod2A时,会自动连接Mod1.lib。

1.4 静态库

要特别注意静态库的自动连接,否则编译时可能会产生错误。

1.4.1 嵌入

可以把静态库看做obj文件的集合。

假如:Mod1是静态库工程,它有1.cpp、2.cpp两个源文件,编译后生成的Mod1.lib,其结构为:

图1.5

假如:Mod2A是静态库工程,它有2A1.cpp、2A2.cpp两个源文件。因为它自动连接Mod1.lib。因此生成的Mod2A.lib,其结构为:

图1.6

从上图可以看到:Mod1.lib的内容被嵌入到Mod2A.lib。

1.4.2 替换

假如:Mod2B是静态库工程,它有1.cpp、2B.cpp两个源文件。因为它自动连接Mod1.lib。因此生成的Mod2B.lib,其结构为:

图1.7

对上图的解释:编译Mod2B时,Mod2B.lib会包含两个obj文件:2B.obj和1.obj。连接Mod1.lib时,会再增加1.obj和2.obj。此时,会有两个1.obj。最终生成的Mod2B.lib只有三个obj文件,其中的1.obj是Mod1.lib里的obj文件。也就是说:Mod2B里的1.obj被替换了。

以图1.2为例,如果Mod1、Mod2A、Mod2B均为静态库,则此三者之间无需设置依赖关系。在编译App时,会自动连接Mod1.lib、Mod2A.lib、Mod2B.lib。

第2章 VC++2005

一个解决方案(Solution),可以由多个工程(Project)构成。如下图所示。

图2.1

2.1 设置依赖关系

英文版请单击【Project】【Dependencies...】菜单项,如下图所示:

图2.2 英文版

中文版请单击【项目】【项目依赖项】菜单项,如下图所示:

图2.3 中文版

显示界面如下。可在该界面下设置工程之间的依赖关系,其操作方法与VC++6.0的操作方法类似。

图2.4

2.2 自动连接

设置了工程依赖项后,编译时编译器会自动编排编译顺序,也会自动连接依赖项。比VC++6.0更加先进的是:VC++2005能够对自动连接依赖项进行控制。

2.2.1 链接库依赖项(Link Library Dependencies)

以图1.2为例,编译App时,会自动连接依赖项:Mod1.lib、Mod2A.lib、Mod2B.lib。如果不想让App自动连接这些库,可以设置App的"Link Library Dependencies"(链接库依赖项)属性为 No,如下面两张图所示:

图2.5 英文版设置

图2.6 中文版设置

2.2.2 忽略导入库(Ignore Import Library)

假如Mod1是动态库,则编译Mod2A、Mod2B、App时,均会自动连接Mod1的导入库Mod1.lib。如果设置Mod1的Ignore Import Library属性为Yes,则编译Mod2A、Mod2B、App时,将不再自动连接导入库Mod1.lib。

Ignore Import Library(忽略导入库)的设置如图2.5和图2.6所示。

2.3 静态库

假如Mod1、Mod2A、Mod2B均为静态库,则编译Mod2A、Mod2B时,默认情况下VC++2005将不会再嵌入Mod1.lib至Mod2A.lib和Mod2B.lib。

如果需要把Mod1.lib嵌入到Mod2A.lib,则需修改Mod2A工程的Use Library Dependency Inputs(使用库依赖项输入)属性,如图2.5和图2.6所示。

设置该项为Yes,则生成Mod2A.lib时,连接的不是Mod1.lib,而是生成Mod1.lib所需的obj文件。即直接连接Mod1工程的obj文件。相当于把Mod1.lib嵌入到Mod2A.lib。

设置该项为No,则生成Mod2A.lib时,连接的是Mod1.lib,但不会把Mod1.lib嵌入到Mod2A.lib。

第3章 VC++2010

3.1 引用工程

VC++2010也可以设置工程依赖项,但是它仅仅用来控制各个工程的编译顺序,不再自动连接依赖项。如果仍希望自动连接依赖项,请使用"引用工程"的功能。鼠标右键单击某个工程,弹出菜单中单击【References...】菜单项。

图3.1

下图中,单击"Add New Reference..."按钮,可以增加一个引用;单击"Remove Reference"可以删除选中的引用;每个被引用的工程将有Link Library Dependencies(链接库依赖项)和Use Library Dependency Inputs(使用库依赖项输入)两个重要的选项。

图3.2

注意:VC++2010的设置更加精准。如:

VC++2005里设置App的Link Library Dependencies为True则连接App时将自动连接Mod1.lib、Mod2A.lib、Mod2B.lib。反之,则不会自动连接Mod1.lib、Mod2A.lib、Mod2B.lib。简单的说就是:要么全部自动连接,要么全不自动连接。

VC++2010里App引用了几个工程就需要设置几次Link Library Dependencies。如:设置引用工程Mod1的Link Library Dependencies为True,则连接App时会自动连接Mod1.lib。反之,则不会自动连接Mod1.lib。

VC++2010比VC++2005的设置更加精准,但是设置的工作量也随之加大。

设置工程之间的引用关系后,工程之间的依赖关系将被自动生成。如下图所示:

图3.3

注意:如果App引用了Mod1,则Mod1前的复选框将被勾中且无法改变其状态。也就是说一旦App引用了Mod1,那么App必定依赖于Mod1,这是无法修改的。

VC++多工程项目的更多相关文章

  1. vs c++配置opencv(1)

    环境: vs2013 opencv2.4.13 准备工作: 1.安装opencv. opencv各版本间存在API差异,opencv提供相应版本的vc文件,在其安装目录 ..opencv\build\ ...

  2. 将声音文件加入VC

    概述 VC++是微软公司开发的一个IDE(集成开发环境),换句话说,就是使用c++的一个开发平台.有些软件就是这个编出来的...另外还有VB,VF.只是使用不同语言...但是,VC++是Windows ...

  3. [转]在VS2010 VC++项目中引用Lib静态库(以Openssl为例)

    本文转自:http://kb.cnblogs.com/page/94467/ Openssl是个为网络通信提供安全及数据完整性的一种安全协议,囊括了主要的密码算法.常用的密钥和证书封装管理功能以及SS ...

  4. VC++6.0环境下调试c语言代码的方法和步骤_附图

    1.C语言程序四步开发步骤 (1)编辑.可以用任何一种编辑软件将在纸上编写好的C语言程序输入计算机,并将C语言源程序文件*.c以纯文本文件形式保存在计算机的磁盘上(不能设置字体.字号等). (2)编译 ...

  5. VC++2008 用空工程创建 DLL

    VC++2008 用空工程创建 DLL 一.创建 DLL 工程项目: 1)点击菜单[File] -> [New] -> [Project...] 弹出 “New Project” 对话框: ...

  6. VC++6.0的使用方法

    VC++6.0的最基本使用方法,创建一个c++项目工程可参考:https://jingyan.baidu.com/article/8ebacdf0cbdb5749f75cd54a.html 这里面的操 ...

  7. 设置 VS 工程目录不保存 sdf / VC.db 文件和 Ipch 文件夹

    使用 Visual Studio 建立 C++ 解决方案时,会生成 SolutionName.sdf(Visual Studio 2015 Update 2 后改为 project_name.VC.d ...

  8. 孙鑫视频VC++深入详解学习笔记

    孙鑫视频VC++深入详解学习笔记 VC++深入详解学习笔记 Lesson1: Windows程序运行原理及程序编写流程 Lesson2: 掌握C++基本语法 Lesson3: MFC框架程序剖析 Le ...

  9. Manual Install Cocos2d-x vc template on Windows 7

    Manual Installation Process Download the template file from HERE and extract it. Open the file CCApp ...

随机推荐

  1. C++vector迭代器失效的问题

    转载:http://blog.csdn.net/olanmomo/article/details/38420907 转载:http://blog.csdn.net/stpeace/article/de ...

  2. number_format

    number_format — 以千位分隔符方式格式化一个数字 说明 string number_format ( float $number [, int $decimals = 0 ] ) str ...

  3. MTK6589下传感器框架结构和代码分析以及传感器的参数指标

    MTK6589下传感器框架结构和代码分析以及传感器的参数指标 作者:韩炜彬  中国当代著名嵌入式研究专家 一.      模块框架 1)配置 路径:Alps/mediatek/config/$(pro ...

  4. request请求对象实例

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="DemoRequest.as ...

  5. libreoffice实现WORD文档转PDF文档

    一.安装LibreOffice 官网:http://www.libreoffice.org/ 二.CentOS安装yum yum install libreoffice 三.执行转换命令 libreo ...

  6. How To Tune or Test PLSQL Code Performance in Oracle D2k Forms

    You can test or tune your program unit performance in Oracle forms with Ora_Prof package.Suppose you ...

  7. 插入中文错误ERROR 1406 (22001): Data too long for column 'name' at row 1

    1.在导入数据前执行以下命令即可:set SESSION sql_mode=''; 通过设置sql_mode变量更改模式.linux下安装完mysql后,默认的sql-mode值是空,在这种情形下my ...

  8. [Effective Java]第二章 创建和销毁对象

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  9. bzoj 1202: [HNOI2005]狡猾的商人 并查集好题

    1202: [HNOI2005]狡猾的商人 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2946  Solved: 1384[Submit][Sta ...

  10. Javascript 简单学习

    一直就崇拜JS如此牛叉的来操作Html标签, 抽出时间来学习学习,哈哈. Js是Netscape公司语言, 基于对象和事件驱动. 与Java不同之处: 1:所属公司不同 2:js是基于对象,java是 ...