#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>