到了2020年末,MIDL 3.0已经发布了。然而,OP所描述的问题仍然存在。但如果你使用Visual Studio,有一种简单的方法来解决这个问题。
如果你要将一个.idl文件添加到一个项目中,在添加文件后,以下MSBuild代码会在项目文件中生成:
<ItemGroup>
<Midl Include="Folder1\YourCustomFile.idl" />
</ItemGroup>
如果您在另一个文件夹中添加了第二个文件并引用了第一个文件,则会生成另一个条目:
<ItemGroup>
<Midl Include="Folder1\YourCustomFile.idl" />
<Midl Include="Folder2\YourSecondCustomFile.idl" />
</ItemGroup>
问题在于,如果您编译该代码,MIDL编译器将不会知道任何其他包含目录。因此,如果您添加:
#include "YourCustomFile.idl"
YourSecondCustomFile.idl
文件开头,MIDL编译器不会在
Folder1
中搜索任何需要包含的.idl文件,导致编译失败。
但是,通过添加
AdditionalIncludeDirectories
MSBuild项目元数据,您可以影响将哪些文件夹作为附加包含目录传递给MIDL编译器。
因此,要指示MIDL编译器在编译
YourSecondCustomFile.idl
时搜索
Folder1
中的包含文件,请按以下方式修改MSBuild代码:
<ItemGroup>
<Midl Include="Folder1\YourCustomFile.idl" />
<Midl Include="Folder2\YourSecondCustomFile.idl">
<AdditionalIncludeDirectories>$(ProjectDir);$(ProjectDir)Folder1</AdditionalIncludeDirectories>
</Midl>
</ItemGroup>
ProjectDir
是一个MSBuild属性,它指向包含当前项目的目录(至少在C++项目中是这样)。;
用于分隔不同的目录。每个目录将作为单独的目录传递给MIDL编译器,以用于搜索包含文件。
这应该解决编译问题。我认为无法使用Visual Studio用户界面添加AdditionalIncludeDirectories
项元数据,因此您应该在文本编辑器中直接编辑Visual Studio项目。
请注意,项元数据对于每个单独的MIDL文件是有效的,即对于引用其他MIDL文件的每个MIDL文件都必须添加AdditionalIncludeDirectories
。
如果您需要在多个AdditionalIncludeDirectories
中具有相同的内容,则可以像这样在项目文件的其他位置定义属性:
<PropertyGroup>
<AdditionalMidlIncludeDirectories>$(ProjectDir);$(ProjectDir)Folder1;$(ProjectDir)Folder2</AdditionalMidlIncludeDirectories>
</PropertyGroup>
然后你在所有地方都使用该属性。你可以将相同的AdditionalIncludeDirectories
语句添加到每个MIDL中,这将确保相同的包含目录用于每个MIDL编译器调用:
<ItemGroup>
<Midl Include="Folder1\YourCustomFile.idl">
<AdditionalIncludeDirectories>$(AdditionalMidlIncludeDirectories)</AdditionalIncludeDirectories>
</Midl>
<Midl Include="Folder2\YourSecondCustomFile.idl">
<AdditionalIncludeDirectories>$(AdditionalMidlIncludeDirectories)</AdditionalIncludeDirectories>
</Midl>
</ItemGroup>
编辑:
如下方评论中所提到的,可以通过应用 MSBuild 的 ItemDefinitionGroup 来进一步简化代码。 ItemDefinitionGroup
用于向 MSBuild 项目项添加元数据,这意味着可以自动将 AdditionalIncludeDirectories
元数据添加到每个 Midl
元素中。 ItemDefinitionGroup
的定义如下:
<ItemDefinitionGroup>
<Midl>
<AdditionalIncludeDirectories>
$(ProjectDir);
$(ProjectDir)Folder1;
$(ProjectDir)Folder2
</AdditionalIncludeDirectories>
</Midl>
</ItemDefinitionGroup>
这将简化
Midl
ItemGroup
,如下所示:
<ItemGroup>
<Midl Include="Folder1\YourCustomFile.idl" />
<Midl Include="Folder2\YourSecondCustomFile.idl" />
</ItemGroup>