MIDL генерирует один и тот же файл для / env win32 и / env win64 - PullRequest
5 голосов
/ 21 октября 2008

В Visual Studio, когда вы компилируете foo.idl, MIDL генерирует информацию прокси в foo_p.c.

К сожалению, для файлов Win32 и x64 используется одно и то же имя файла. Для Win32 файл начинается с:

#if !defined(_M_IA64) && !defined(_M_AMD64)

Для x64 файл начинается с:

#if defined(_M_AMD64)

Когда вы собираете для Win32, а затем сразу же собираете для x64, он не заменяет файл foo_p.c, что означает, что проект не может связать.

Я попытался создать событие перед сборкой, которое удалит файл foo_p.c, если это не та архитектура, но VS даже не удосужился выполнить этот шаг.

Как получить, чтобы я мог построить одну конфигурацию, а затем другую?

Ответы [ 2 ]

4 голосов
/ 21 октября 2008

Вы можете изменить настройки компилятора для вашего файла IDL, указав другое имя файла для выходного прокси-файла в соответствии с целевой платформой. (Выберите «Свойства» в файле IDL, затем «Свойства конфигурации / MIDL / Вывод»).

  • Для сборок Win32 используйте foo_p_w32.c
  • Для сборок x64 используйте foo_p_x64.c

Затем в настройках проекта Win32 исключите файл foo_p_x64.c и наоборот для проекта x64.

Вам нужно сделать то же самое для файла _i.c, иначе Visual Studio вообще не перестраивает IDL.

0 голосов
/ 07 февраля 2011

Вот изменения конфигурации, которые мы используем, чтобы автоматизированные сборки работали без ошибок

Изменение

<Tool
Name="VCMIDLTool"
TypeLibraryName="$(ProjectName).tlb"
OutputDirectory="$(SolutionDir)$(PlatformName)"
HeaderFileName="$(ProjectName)_h.h"
DLLDataFileName="$(ProjectName)_dlldata.c"
/>

К

<Tool
    Name="VCMIDLTool"
    TypeLibraryName="$(InputName).tlb"
    OutputDirectory="$(SolutionDir)$(PlatformName)"
    HeaderFileName="$(InputName)_i.h"
    DLLDataFileName="$(InputName)_dlldata.c"
    InterfaceIdentifierFileName="$(InputName)_i.c"
    ProxyFileName="$(InputName)_p.c"
/>

и добавьте $ (SolutionDir) $ (PlatformName) в свои дополнительные каталоги C ++

, например

<Tool Name="VCCLCompilerTool" ...
AdditionalIncludeDirectories="...;&quot;$(SolutionDir)$(PlatformName);&quot;"
...