VC++多工程项目
目录
2.2.1 链接库依赖项(Link Library Dependencies) 8
2.2.2 忽略导入库(Ignore Import Library) 9
第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++多工程项目的更多相关文章
- vs c++配置opencv(1)
环境: vs2013 opencv2.4.13 准备工作: 1.安装opencv. opencv各版本间存在API差异,opencv提供相应版本的vc文件,在其安装目录 ..opencv\build\ ...
- 将声音文件加入VC
概述 VC++是微软公司开发的一个IDE(集成开发环境),换句话说,就是使用c++的一个开发平台.有些软件就是这个编出来的...另外还有VB,VF.只是使用不同语言...但是,VC++是Windows ...
- [转]在VS2010 VC++项目中引用Lib静态库(以Openssl为例)
本文转自:http://kb.cnblogs.com/page/94467/ Openssl是个为网络通信提供安全及数据完整性的一种安全协议,囊括了主要的密码算法.常用的密钥和证书封装管理功能以及SS ...
- VC++6.0环境下调试c语言代码的方法和步骤_附图
1.C语言程序四步开发步骤 (1)编辑.可以用任何一种编辑软件将在纸上编写好的C语言程序输入计算机,并将C语言源程序文件*.c以纯文本文件形式保存在计算机的磁盘上(不能设置字体.字号等). (2)编译 ...
- VC++2008 用空工程创建 DLL
VC++2008 用空工程创建 DLL 一.创建 DLL 工程项目: 1)点击菜单[File] -> [New] -> [Project...] 弹出 “New Project” 对话框: ...
- VC++6.0的使用方法
VC++6.0的最基本使用方法,创建一个c++项目工程可参考:https://jingyan.baidu.com/article/8ebacdf0cbdb5749f75cd54a.html 这里面的操 ...
- 设置 VS 工程目录不保存 sdf / VC.db 文件和 Ipch 文件夹
使用 Visual Studio 建立 C++ 解决方案时,会生成 SolutionName.sdf(Visual Studio 2015 Update 2 后改为 project_name.VC.d ...
- 孙鑫视频VC++深入详解学习笔记
孙鑫视频VC++深入详解学习笔记 VC++深入详解学习笔记 Lesson1: Windows程序运行原理及程序编写流程 Lesson2: 掌握C++基本语法 Lesson3: MFC框架程序剖析 Le ...
- 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 ...
随机推荐
- wpfのuri(让你完全明白wpf的图片加载方式以及URI写法)
绝对 pack WPF URI pack://application:,,,/是协议:“,,,”是“///”的变体 1.资源文件 — 本地程序集 Uri uri = new Uri("pac ...
- Xcode的Architectures和Valid Architectures的区别,
登录 | 注册 ys410900345的专栏 目录视图摘要视图订阅 学院APP首次下载,可得50C币! 欢迎来帮助开源“进步” 当讲师?爱学习?投票攒课吧 CSDN 2015博 ...
- 压缩和解压缩gz包
gz是Linux和OSX中常见的压缩文件格式,下面是用java压缩和解压缩gz包的例子 public class GZIPcompress { public static void FileCompr ...
- C语言第2天基本运算
getchar 一.首先给出<The_C_Programming_Language>这本书中的例子: #include <stdio.h> int main( ) { ...
- Arduino中的setup()和loop()函数
今天看arduino的源代码,对于arduino中的setup和loop有了新的理解,可能你以前对于这俩个函数就是知道arduino是初始化,而loop是死循环,但是托若你看了Arduino的主函数你 ...
- 在Linux命令行下令人惊叹的惊叹号(!)
'!'符号在Linux中不但可以用作否定符号,还可以用来从历史命令记录中取出命令或不加修改的执行之前运行的命令.下面的所有命令都已经在Bash Shell中经过确切地检验.尽管我没有试过,但大多都不能 ...
- raid0,raid1,raid10,raid5,raid50,raid6,raid60的功能总结简述
1,raid0的特性:采用剥离,数据将在几个磁盘上进行分割.数据被分成很多数据块,每一数据块会被写入不同的磁盘.从而, 每一磁盘的工作负荷都得到了降低,这有助于加速数据传输.RAID-0可让磁盘更好地 ...
- js 返回并刷新
chrome 下 history.back()或者history.go(-1)都是返回并刷新的,但是ff浏览器只返回不刷新 location = document.referrer 这个在两个浏览器下 ...
- ERROR 1044 (42000): Access denied for user 'root'@'localhost' to database 'mysql'
mysql> use mysqlERROR 1044 (42000): Access denied for user 'root'@'localhost' to database 'mysql' ...
- Web开发, 跳转时出现java.lang.ClassNotFoundException
发生这种状况一般都是由于类找不到,要么是web.xml没有配对位置,要么是类没有放好