2012-06-26 4 views
4

Недавно я установил VS2008 на новую машину и теперь обнаруживаю, что он не будет связываться с DLL, построенным на более раннем машина, дающая ошибку LNK2001: неразрешенный внешний символ __forceCRTManifestCUR. Я предполагаю, что это относится к проблеме с Side-By-Side.Как обновить VS2008 от версии 9.0.21022.8 RTM до 9.0.30729.4462 QFE (надеюсь, разрешите ошибку __forceCRTManifestCUR)

Изучив немного, я теперь подозреваю, что проблема в том, что старая установка VS2008 обновлена ​​до версии 9.0.30729.4462 QFE, тогда как новая установка VS2008 находится на 9.0.21022.8 RTM.

Изучая далее, я прочитал, что мне необходимо установить SQL Server 2008 по меньшей мере на SP1, чтобы обновить VS2008 до более поздней версии. Однако я установил SQL Server 2008 на новую машину, и теперь он находится на SR3, но VS2008 все еще находится на версии 9.0.21022.8. Я подозреваю, что SQL Server, который я установил, был предварительно обработан до SR2, и это может быть проблемой.

для Windows (Microsoft) Обновление не показывает отложенные обновления для любого SQL Server 2008 или Visual Studio 2008.

Пожалуйста, вы можете предложить способ форсирования Visual Studio для обновления до версии 9.0.30729.4462 QFE?

В качестве альтернативы, есть ли другие решения этой проблемы, которые не связаны с перекомпиляцией всех моих предварительно скомпилированных библиотек DLL?

+0

Я знаю - это оказалось чем-то вроде глупой ошибки с моей стороны, и я с радостью удалю этот вопрос, если это никому не поможет. Но я оставлю его здесь на данный момент на всякий случай, если кто-то другой будет введен в заблуждение/запутанным так же, как и я. Пожалуйста, не смей меня за это, но прокомментируйте это, если вы считаете, что его нужно удалить как «бесполезный». –

ответ

1

Упс - похоже, что я был полностью введен в заблуждение Microsoft.

Оказалось, что это пакет обновления 1 для Visual Studio, который обновляет версию с 9.0.21022 по 9.0.30729.

Я был убежден, что я уже SP1 установлен, потому что:

а) О диалоге упоминается SP1 явно (хотя это оказалось .Net 3.5 SP1 не Visual Studio 2008 SP1)

b) Центр обновления Windows не предлагал пакет обновления 1 (SP1), а все ссылки «Проверить обновление» ссылаются на страницу с инструкцией по использованию Центра обновления Windows.

После моего первоначального вопроса мне удалось собрать исходную базу, установив пакет функций C++ для VS2008, но ничего не вышло из-за ошибок Side-by-Side. В конце концов мне пришло в голову, что, возможно, SP1 не был установлен.

1

пока VS2008 еще на версии 9.0.21022.8

Это не ваши и директив #includes CRT библиотеки было на самом деле получить повышен до 9.0.30729.4462 при установке исправлений/Service Pack/безопасность патч.

Открыть vc/include/crtassem.h, чтобы увидеть суп из макроса. Важным является значение макроса _BIND_TO_CURRENT_CRT_VERSION, которое действует при компиляции кода. Когда установлено значение 0, вы заявите зависимость от оригинальной RTM-версии CRT (9.0.21022.8). С пальцами, скрещенными за спиной, Microsoft не вносила никаких изменений в ЭЛТ, которые разрушат ваш код, когда он запускается на машине, на которой установлена ​​политика издателя, которая перенаправляется на более позднюю версию CRT.

С установленным значением 1 вы заявите зависимость от версии CRT, на которой вы действительно протестировали ваш код, тот, который установлен на вашей машине dev. Это более разумная вещь. Несмотря на то, что Microsoft столкнулась с некоторыми проблемами, чтобы гарантировать, что патчи обслуживания на CRT ничего не сломали, я никогда не слышал о случае, когда это произошло.

То, что предупреждение компоновщика пытается сказать вам, когда-либо так неуклюже, заключается в том, что вы пытаетесь связать код, который был скомпилирован с _BIND_TO_CURRENT_CRT_VERSION, установленным в 0 с кодом, который был скомпилирован с ним, равным 1. Что, конечно, не делает смысл, вы не можете иметь его в обоих направлениях.

Исправьте настройки компилятора, они должны быть одинаковыми для всего кода, на который вы ссылаетесь.

+0

Thanks Hans, Есть ли _BIND_TO_CURRENT_CRT_VERSION тот же флаг, что и _BIND_TO_CURRENT_VCLIBS_VERSION (который, как представляется, равен 1)? Я не вижу, что _BIND_TO_CURRENT_CRT_VERSION определяется где угодно в моих проектах. Содержание моего CRTASSEM.H следующим образом: #ifndef _VC_ASSEMBLY_PUBLICKEYTOKEN #define _VC_ASSEMBLY_PUBLICKEYTOKEN "1fc8b3b9a1e18e3b" #endif #ifndef _CRT_ASSEMBLY_VERSION #define _CRT_ASSEMBLY_VERSION "9.0.21022.8" #endif #ifndef __LIBRARIES_ASSEMBLY_NAME_PREFIX #define __LIBRARIES_ASSEMBLY_NAME_PREFIX "Microsoft.VC90" #endif –

2

Поздний ответ, я знаю и многое другое для потомков, но у меня было такое же расхождение между установками VS 2008 на двух машинах. Одна сообщаемая версия «9.0.30729.1 SP», а другая «9.0.30729.4462 QFE». Я хотел, чтобы они были такими же, и знал, что первый уже установил пакет обновления.

Это сообщение вдохновило меня на то, чтобы сначала установить SQL 2008 R2, и это оказалось ключом. После этого обе версии VS были «.4462 QFE».

+0

Помните, если вы только что установили движок или вам нужны другие функции 2008r2, такие как SSMS 2008 года? Я прочитал это вчера и собираюсь сделать это сейчас, но не хочу сжигать слишком много места на жестком диске, чтобы скопировать настройки VS 2008 на новую машину. – basher

+0

@basher Я бы тоже установил SSMS:/ – Ian

+0

Чтобы ответить на приведенный выше комментарий, вам не нужно устанавливать SSMS для получения версии QFE. Просто установите BIDS из установки SQL 2008 R2. Я сделал это, и все получилось очень хорошо. – Loki70