Visual c++ 替换Visual C中的#导入++; 我们有一个大型的C++项目,我们用/MP交换机编译它来利用多个内核。

Visual c++ 替换Visual C中的#导入++; 我们有一个大型的C++项目,我们用/MP交换机编译它来利用多个内核。,visual-c++,com,Visual C++,Com,然而,我们最近引入了一些在几个tlb上使用#import的代码,并且#import与/MP不兼容,这意味着我们回到了单线程构建,并且有更多的时间喝咖啡 关于如何让#import和/MP发挥作用有什么建议吗?是否有一个工具,可以静态地将来自C++导入的C++头作为预构建步骤? 更新: 听从马特的建议效果很好。对于在谷歌遇到这个问题的其他人: 创建一个单独的静态库项目 设置足够的include,以便将#import语句放入lib项目中 使主项目依赖于lib项目(以确保正确的构建顺序) 将lib项目的

然而,我们最近引入了一些在几个tlb上使用#import的代码,并且#import与/MP不兼容,这意味着我们回到了单线程构建,并且有更多的时间喝咖啡

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

更新:

听从马特的建议效果很好。对于在谷歌遇到这个问题的其他人:

  • 创建一个单独的静态库项目
  • 设置足够的include,以便将
    #import
    语句放入lib项目中
  • 使主项目依赖于lib项目(以确保正确的构建顺序)
  • 将lib项目的临时生成文件夹添加到主项目的include路径中
  • #包括
    生成的.tlh文件,您在其中执行导入#
  • 启用
    /MP
    开关并失去咖啡休息时间
    您可以将项目分为两部分,一部分或多或少执行导入禁用/MP,另一部分执行其他所有操作启用/MP。

    一个选项是将导入移动到单独的DLL中,并使用不透明指针为它们提供包装类。然后仅对该DLL禁用/MP,构建的其余部分就应该可以了。

    为什么不只包含从导入创建的头文件呢

    您可以尝试使用老式的方法从C/C++访问COM对象。这涉及到COM对象的开发人员,这些对象提供具有C/C++版本COM接口的客户端.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创建的接口类一样好。这取决于您使用了多少“导入特定”功能


    对于/MP,我已经完成了我的建议和马特·戴维森(Matt Davison)回答中的一些建议。您可以将/MP选项作为一个整体用于项目,然后使用/MP1选项对单个文件进行例外处理。

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

    Perfect。。。我没有注意到输出目录中的“tlh”文件,但这看起来正是我需要的。我从来不知道!这是可行的,但是将导入分离到一个单独的DLL中并将其包装将是一项艰巨的工作。是的,但在此过程中,您将加快构建速度,并将使用的库与使用的库分离。我有COM对象的源代码,但是生成的头文件缺少名称空间,仅在名称空间中包装#includes不起作用。有没有办法让Include与#import兼容?