Зависимость от DLL к собственной библиотеке импорта, как избежать?

#visual-studio #visual-studio-2010 #dll #msbuild

#visual-studio #visual-studio-2010 #dll #msbuild

Вопрос:

Я создаю прокси / библиотеку-заглушку из файла IDL, и по какой-то причине драйвер сборки считает, что библиотека импорта, сгенерированная во время ссылки, является входным файлом для ссылки, в результате чего проект каждый раз перелинковывается (имена путей сокращены для удобства чтения):

 10:05:33.764 1>
Target "Link: (TargetId:66)" in file "C:Program Files (x86)MSBuildMicrosoft.Cppv4.0PlatformsWin32Microsoft.Cpp.Win32.Targets" from project "[...]VersionControl.vcxproj" (target "_Link" depends on it):
Using "Link" task from assembly "Microsoft.Build.CppTasks.Win32, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a".
Task "Link" (TaskId:26)
    Write Tracking Logs: (TaskId:26)
[...]
    Outputs for [...]DEBUGDLLDATA.OBJ|[...]DEBUGVERSIONCONTROL.DLL.EMBED.MANIFEST.RES|[...]DEBUGVERSIONCONTROL_I.OBJ|[...]DEBUGVERSIONCONTROL_P.OBJ: (TaskId:26)
    [...]DEBUGVERSIONCONTROL.ILK (TaskId:26)
    [...]DEBUGVERSIONCONTROL.DLL (TaskId:26)
    [...]DEBUGVERSIONCONTROL.DLL.INTERMEDIATE.MANIFEST (TaskId:26)
    [...]DEBUGVERSIONCONTROL.PDB (TaskId:26)
    Inputs for [...]DEBUGDLLDATA.OBJ|[...]DEBUGVERSIONCONTROL.DLL.EMBED.MANIFEST.RES|[...]DEBUGVERSIONCONTROL_I.OBJ|[...]DEBUGVERSIONCONTROL_P.OBJ: (TaskId:26)
    [...]LIBRPCRT4.LIB (TaskId:26)
    [...]LIBKERNEL32.LIB (TaskId:26)
    [...]LIBUSER32.LIB (TaskId:26)
    [...]LIBGDI32.LIB (TaskId:26)
    [...]LIBWINSPOOL.LIB (TaskId:26)
    [...]LIBCOMDLG32.LIB (TaskId:26)
    [...]LIBADVAPI32.LIB (TaskId:26)
    [...]LIBSHELL32.LIB (TaskId:26)
    [...]LIBOLE32.LIB (TaskId:26)
    [...]LIBOLEAUT32.LIB (TaskId:26)
    [...]LIBUUID.LIB (TaskId:26)
    [...]LIBODBC32.LIB (TaskId:26)
    [...]LIBODBCCP32.LIB (TaskId:26)
    [...]DEBUGVERSIONCONTROL.DLL.EMBED.MANIFEST.RES (TaskId:26)
    [...]DEBUGDLLDATA.OBJ (TaskId:26)
    [...]DEBUGVERSIONCONTROL_I.OBJ (TaskId:26)
    [...]DEBUGVERSIONCONTROL_P.OBJ (TaskId:26)
    [...]SYSTEM32TZRES.DLL (TaskId:26)
    [...]SORTINGSORTDEFAULT.NLS (TaskId:26)
    [...]DEBUGVERSIONCONTROL.EXP (TaskId:26)
    [...]DEBUGVERSIONCONTROL.LIB (TaskId:26)
    [...]VERSIONCONTROL.DEF (TaskId:26)
    [...]LIBMSVCRTD.LIB (TaskId:26)
    [...]LIBOLDNAMES.LIB (TaskId:26)
    Source compilation required: input [...]DEBUGVERSIONCONTROL.LIB is newer than output [...]DEBUGVERSIONCONTROL.DLL. (TaskId:26)
  

Проект настроен как обычный проект DLL, с настройками, оставленными по умолчанию. Есть идеи, почему MSBuild решает, что эти сгенерированные файлы следует рассматривать как входные данные, и как я мог бы это исправить?

Комментарии:

1. «VersionControl» — необычное имя для прокси / заглушки DLL. Мои хрустальные шары говорят, что ваш основной проект COM-сервера также называется «VersionControl».

2. Нет, это просто название интерфейса. В настоящее время единственная реализация находится в главном приложении, а COM используется только для переноса длительных операций в отдельный поток. В какой-то момент я планирую выделить код в отдельную DLL, которая будет названа в честь системы VC, с которой она взаимодействует, и зарегистрирована в категории.

3. Обычно я создаю один проект, содержащий IDL для интерфейсов, который создает библиотеку P / S, и каждая реализация импортирует IDL оттуда и определяет coclass es.

4. Есть ли вероятность, что вы пропустили #define и случайно __declspec(dllimport) возвращаете некоторые из своих собственных функций обратно? Или аналогично у вас есть @pragma(comment, lib) для . библиотека в коде, которая включается в сборку DLL? Я бы попробовал #erroring все части импорта ваших файлов заголовков. (Или это буквально просто код-заглушка, сгенерированный из IDL?)

5. Это всего лишь код-заглушка плюс .def файл для экспорта обычных подозреваемых.

Ответ №1:

Это попытка в темноте, но стоит посмотреть…

Откройте ваш файл vcxproj и найдите элемент @(Midl). Измените ее, попробовав одну из этих трех частей метаданных элемента, и посмотрите, как изменится поведение, это может вывести вас на правильный путь:

   <Midl Include="My.idl">
    <LinkCompiled>false</LinkCompiled>
    <LibCompiled>false</LibCompiled>
    <ImpLibCompiled>false</ImpLibCompiled>
  </Midl>