VC++多工程项目

Wesley13
• 阅读 842

目录

第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四个工程组成。

VC++多工程项目

图1.1

1.1 设置依赖关系

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

VC++多工程项目

图1.2

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

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

VC++多工程项目

图1.3

显示界面如下

VC++多工程项目

图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,其结构为:

VC++多工程项目

图1.5

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

VC++多工程项目

图1.6

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

1.4.2 替换

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

VC++多工程项目

图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)构成。如下图所示。

VC++多工程项目

图2.1

2.1 设置依赖关系

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

VC++多工程项目

图2.2 英文版

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

VC++多工程项目

图2.3 中文版

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

VC++多工程项目

图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 英文版设置

VC++多工程项目

图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...】菜单项。

VC++多工程项目

图3.1

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

VC++多工程项目

图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的设置更加精准,但是设置的工作量也随之加大。

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

VC++多工程项目

图3.3

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

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Karen110 Karen110
3年前
一篇文章带你了解JavaScript日期
日期对象允许您使用日期(年、月、日、小时、分钟、秒和毫秒)。一、JavaScript的日期格式一个JavaScript日期可以写为一个字符串:ThuFeb02201909:59:51GMT0800(中国标准时间)或者是一个数字:1486000791164写数字的日期,指定的毫秒数自1970年1月1日00:00:00到现在。1\.显示日期使用
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Stella981 Stella981
3年前
Android蓝牙连接汽车OBD设备
//设备连接public class BluetoothConnect implements Runnable {    private static final UUID CONNECT_UUID  UUID.fromString("0000110100001000800000805F9B34FB");
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Stella981 Stella981
3年前
Forrester机器学习报告发布,腾讯云跃居第一阵营
  !(https://nimg.ws.126.net/?urlhttp%3A%2F%2Fdingyue.ws.126.net%2F2020%2F1016%2Fecdc1f59j00qi98j7000od200u000fpg00it009u.jpg&thumbnail650x2147483647&quality80&typejpg)  A
Wesley13 Wesley13
3年前
VC++读写文件
目录第1章读写文件1(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fwww.cnblogs.com%2Fhanford%2Fp%2F6028068.html%23_Toc426916801)1.1API    1(https://www.oschina.net/actio
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这