2020 年底,MIDL 3.0 已经发布。但是,OP描述的问题仍然存在。但是,如果您使用的是 Visual Studio,则有一种直截了当的方法来处理该问题。
如果要将 .idl 文件添加到项目中,则会在添加 .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"
MIDL 编译器开始YourSecondCustomFile.idl
时不会搜索Folder1
要包含的任何 .idl 文件,编译将失败。
但是,通过添加AdditionalIncludeDirectories
MSBuild 项元数据,您可以影响将哪些文件夹作为附加包含目录传递给 MIDL 编译器。
因此,要指示 MIDL 编译器在编译时搜索Folder1
包含文件, YourSecondCustomFile.idl
请修改 MSBuild 代码,如下所示:
<ItemGroup>
<Midl Include="Folder1\YourCustomFile.idl" />
<Midl Include="Folder2\YourSecondCustomFile.idl">
<AdditionalIncludeDirectories>$(ProjectDir);$(ProjectDir)Folder1</AdditionalIncludeDirectories>
</Midl>
</ItemGroup>
ProjectDir
是一个 MSBuild 属性,指向包含当前项目的目录(至少在 C++ 项目中是这样)。;
用于分隔不同的目录。这些目录中的每一个都将作为单独的目录传递给 MIDL 编译器以搜索包含文件。
这应该可以解决编译问题。我不认为AdditionalIncludeDirectories
可以使用 Visual Studio 的用户界面添加项目元数据,因此您应该直接在文本编辑器中编辑 Visual Studio 项目。
请注意,项目元数据对每个项目有效,即对于每个单独的 MIDL 文件。因此,您必须添加AdditionalIncludeDirectories
到引用其他 MIDL 文件的每个 MIDL 文件。
如果您需要多个相同的内容,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进一步简化代码。AnItemDefinitionGroup
用于将元数据添加到 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>