zoukankan      html  css  js  c++  java
  • VC++多工程项目

    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)构成。如下图所示。此项目由AppMod1Mod2AMod2B四个工程组成。

    1.1

    1.1 设置依赖关系

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

    1.2

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

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

    1.3

    显示界面如下

    1.4

    上图表示工程App依赖于Mod1Mod2AMod2B。可以更换AppMod1Mod2AMod2B,依次设置这些工程的依赖项。

    1.2 编译顺序

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

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

    1.3 自动连接

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

    1.4 静态库

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

    1.4.1 嵌入

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

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

    1.5

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

    1.6

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

    1.4.2 替换

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

    1.7

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

    以图1.2为例,如果Mod1Mod2AMod2B均为静态库,则此三者之间无需设置依赖关系。在编译App时,会自动连接Mod1.libMod2A.libMod2B.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.libMod2A.libMod2B.lib。如果不想让App自动连接这些库,可以设置App的"Link Library Dependencies"(链接库依赖项)属性为 No,如下面两张图所示:

     

    2.5 英文版设置

    2.6 中文版设置

    2.2.2 忽略导入库(Ignore Import Library

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

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

    2.3 静态库

    假如Mod1Mod2AMod2B均为静态库,则编译Mod2AMod2B时,默认情况下VC++2005将不会再嵌入Mod1.libMod2A.libMod2B.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里设置AppLink Library DependenciesTrue则连接App时将自动连接Mod1.libMod2A.libMod2B.lib。反之,则不会自动连接Mod1.libMod2A.libMod2B.lib。简单的说就是:要么全部自动连接,要么全不自动连接。

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

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

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

    3.3

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

  • 相关阅读:
    BI之SSAS完整实战教程1 -- 开篇, BI简介 & SSAS简介
    MVC 5 + EF6 入门完整教程14 -- 动态生成面包屑导航
    MVC5+EF6 入门完整教程12--灵活控制Action权限
    JVM垃圾收集
    JVM类加载
    前端UI框架
    前端学习
    JVM字节码
    网络编程
    Java NIO
  • 原文地址:https://www.cnblogs.com/hanford/p/6027974.html
Copyright © 2011-2022 走看看