我们有一个大型的C ++项目,我们用它来编译/ MP开关,以利用多个核心。
然而,我们最近引入了一些在几个tlb上使用#import的代码,而#import与/ MP不兼容,这意味着我们回到单线程构建并且有更多时间来喝咖啡。
有关如何让#import和/ MP玩得好的任何建议?是否有一个工具可以从#import静态生成C ++标头作为预构建步骤?
更新
以下马特的建议很有效。对于其他在google中绊倒的人来说:
#import
语句放在lib项目中#include
生成的.tlh
文件,您正在执行#import
/MP
开关并丢失咖啡休息时间...... 答案 0 :(得分:25)
为什么不只是#include
从#import
创建生成的标头?
答案 1 :(得分:8)
(我对这个问题有点迟了,但这是我心中的一个问题。)
您可以尝试使用旧式的方式从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),打开类型库和save-as和OLD / IDL文件。然后运行MIDL编译器以生成客户端C / C ++包含文件。有可能第三方COM对象可能带有这些文件,但它们通常不会(我记得Crystal Reports 做了一段时间,然后停止运送它们 - 把我们搞砸了 - 但是我离题)。
使用ATL智能指针(以及其他支持类)和MIDL创建的接口类几乎与#import创建的一样好。这取决于您使用的#import特定功能的数量。
对于/ MP我已经完成了我的建议以及接受的Matt Davison回答所建议的内容。
答案 2 :(得分:7)
您可以将/ MP选项作为整体使用,然后使用 / MP1 选项对单个文件进行例外处理。
答案 3 :(得分:3)
如果你可以限制你正在导入的文件数量,你可以将它们放在已经自动从/ MP中排除的预编译头文件(例如stdafx.h)中。这避免了上述问题,因为所有其他文件将等到编译器直到stdafx.cpp完成,并且都会“继承”相同的#import'ed定义。
答案 4 :(得分:2)
一种选择是将导入移动到单独的DLL中,并使用不透明指针为它们提供包装类。然后只为该DLL禁用/ MP,其余的构建应该没问题。
答案 5 :(得分:1)
您可以将项目拆分为两部分,一部分或多或少地导入禁用/ MP,另一部分执行其他任何启用/ MP。
答案 6 :(得分:-2)