代码之家  ›  专栏  ›  技术社区  ›  Rob Walker

在Visual C++中替换导入

  •  29
  • Rob Walker  · 技术社区  · 16 年前

    我们有一个大型的C++项目,用来编译/MP交换机以利用多个内核。

    但是,我们最近引入了一些在两个TLB上使用import的代码,并且import与/mp不兼容,这意味着我们回到了单线程构建,并且有更多的时间来获取咖啡。

    关于如何让导入和/MP发挥作用有什么建议吗?是否有一个工具可以静态地从一个导入导入静态生成C++头作为一个预构建步骤?

    更新:

    听从马特的建议效果很好。对于在Google中遇到的其他人:

    1. 创建单独的静态库项目
    2. 设置足够的包含,以便您可以将 #import lib项目中的语句
    3. 使主项目依赖于lib项目(以确保正确的构建顺序)
    4. 将lib项目的临时生成文件夹添加到主项目的include路径中
    5. #include 生成的 .tlh 你做的文件 输入输出
    6. 启用 /MP 换掉咖啡休息时间…
    7 回复  |  直到 16 年前
        1
  •  25
  •   Matt Davison    16 年前

    为什么不只是 #include 从创建的标题 #import ?

        2
  •  8
  •   Aardvark    16 年前

    (这个问题我有点晚了,但这是我内心深处的一个问题。)

    你可以尝试使用旧式的方法从C/C++中访问COM对象。这涉及COM对象的开发人员提供具有COM接口C/C++版本的客户端.h文件。这些文件看起来像是import生成的简单版本。

    这些文件是从哪里来的?如果COM对象是用C/C++(VC++)编写的,那么这些来自于MIDL编译器。这个命令行工具采用ODL/IDL文件,并从中创建C/C++源代码。它发出的一些内容对客户端应用程序很有用。

    如果你有COM对象的来源,你可能已经有了这些文件!

    如果只有TLB文件,则可以使用OLE/COM对象查看器(oleview.exe-至少附带VC++6.0),打开类型库并另存为和旧的/idl文件。然后运行MIDL编译器来生成客户端C/C++的包含文件。第三方COM对象可能会附带这些文件,但它们通常不会(我记得Crystal Reports 有一段时间,他们停止了运输-拧我们的皇家-但我离题了)。

    将ATL智能指针(和其他支持类)与MIDL创建的接口类一起使用几乎与IMPORT创建的接口类一样好。这取决于您使用的导入特定功能的多少。

    对于议员们,我既做了我的建议,也做了一些被接受的马特·戴维森的回答所建议的。

        3
  •  7
  •   Dimitri C.    16 年前

    您可以将/mp选项作为一个整体用于项目,然后使用 /MP1 选择权。

        4
  •  3
  •   adzm    11 年前

    如果可以限制要导入的文件的数量,可以将这些文件放入预编译头文件(如stdafx.h),该头文件已自动从/mp中排除。这就避免了上述问题,因为所有其他文件都将等待编译器,直到stdafx.cpp完成,并且都将“继承”相同的导入定义。

        5
  •  2
  •   Salman A    16 年前

    一个选项是将导入移动到单独的dll中,并使用不透明指针为其提供包装类。然后只对那个dll禁用/mp,其余的构建就可以了。

        6
  •  1
  •   dalle    16 年前

    您可以将项目分成两部分,一部分或多或少地执行导入禁用/mp,另一部分执行其他所有启用/mp的操作。

        7
  •  -2
  •   Daniel    16 年前