vs2012 совместимость с наборами инструментов

В моем VS2012 доступно 4 набора инструментов: v90, v100, v110 и v110_xp. Я провел простой тест с двумя проектами testlib (статическая библиотека) и testexe (консольное приложение). Интерфейс был только одна функция с подписью void test(), Результаты, достижения:

  • testlib (v90), testexe (что-либо кроме v90) -> не связывает
  • testlib (v100), testexe (v110 или v110_xp) -> делает ссылку

Тем не менее, мне показалось несколько странным, что v100 и v110 будут соединяться, поэтому я попытался немного усложнить сценарий. Теперь мой метод выглядит так: std::map<std::string, std::string> test(const std::string& arg), Как и ожидалось, testlib (v100) и testexe (v110) не связываются (mismatch detected for '_MSC_VER').

Но все же testlib (v110) и testexe (v110_xp) связывают друг друга, и полученный exe работает на Windows XP. Это случайно или это поддерживаемый сценарий? Если это случайно, то пример кода, который использует только функции, доступные в v110_xp и нарушает эту совместимость, будет приветствоваться. Мне интересно, стоит ли мне развертывать две версии моей библиотеки на моих клиентах или только ту, скомпилированную с v110.

6

Решение

Слово «набор инструментов» является немного неправильным для описания различий между v110 и v110_xp. Вы все еще используете те же инструменты сборки. И у вас все еще есть та же версия CRT. Что-то, что вы можете увидеть, сравнив то, что вы видите в списке загруженных DLL-библиотек Debug + Windows + между двумя сборками. Обратите внимание на имя и местоположение msvcr110.dll.

CRT был фактически обновлен обновлением 1, теперь он поддерживает как XP, так и более новые версии Windows. Это работает путем динамической привязки к последующим функциям winapi во время выполнения, используя GetProcAddress (), хромая, если он не может найти их при запуске в XP.

Отличие заключается в том, что вы получили еще одну версию Windows SDK. Последний, который все еще был совместим с XP, версия 7.1. Вы найдете его в C: \ Program Files (x86) \ Microsoft SDKs \ Windows \ v7.1A. При сборке с помощью набора инструментов v110 вы будете использовать SDK include и библиотечные файлы, хранящиеся в C: \ Program Files (x86) \ Windows Kits \ 8.0

Конкретные изменения при использовании v110_xp видны при поиске в строке c: \ program files (x86) \ msbuild этой строки:

  • каталоги для файлов include и lib, etcetera, изменены на пути Windows 7.1 SDK
  • добавлен символ препроцессора _USING_V110_SDK71_, который не используется в других важных местах
  • опция компоновщика / SUBSYSTEM изменена, чтобы требовать только версию Windows 5.02, номер версии XP.

Короче говоря, микширование модулей, которые были созданы с использованием набора инструментов v110 и v110_xp, не является проблемой.

12

Другие решения

смешивание v110_xp исполняемые файлы и v110 библиотеки официально не поддерживаются.

Обострив эту проблему отдельно с Microsoft, они ответили на следующие вопросы:

Q1: Может ли приложение, которое использует эти библиотеки (v110) и построено с набором инструментов v110_xp, правильно работать на компьютере с Windows XP?

Только исполняемый файл, созданный с помощью набора инструментов v110_xp, может нормально работать на компьютере с Windows XP. В результате, если приложение должно работать должным образом на компьютере с Windows XP, вам необходимо убедиться, что ваш проект переключен с набора инструментов v110 по умолчанию на недавно представленный набор инструментов v110_xp на страницах свойств вашего проекта, включая исполняемый файл и библиотеки DLL, если есть какие-либо.

В2: Нужно ли нам выпускать другую версию этих библиотек, собранную с набором инструментов v110_xp?

Я думаю, это зависит от того, на какой платформе вам нужно развернуть ваше приложение. Если ваш план развертывания включает компьютеры под управлением Windows XP, необходимо выпустить новую версию исполняемого файла / DLL, созданного с помощью набора инструментов v110_xp. Однако, учитывая, что те же исполняемые файлы / библиотеки DLL, созданные с помощью набора инструментов v110_xp, также будут работать в Vista и более поздних версиях, я предлагаю вам просто сохранить одну версию исполняемого файла / библиотеки DLL, созданной с помощью набора инструментов v110_xp, и она может работать на всех других платформах. Когда Windows XP больше не входит в ваш план развертывания, вы можете преобразовать весь исполняемый файл / DLL для перестройки с помощью набора инструментов v110. Конечно, будет хорошо, если вы сможете поддерживать две версии исполняемых файлов / библиотек DLL одновременно, если вы хотите использовать Windows XP и другие системы отдельно.

Вопрос 3. Поддерживает ли Microsoft библиотеки, созданные с помощью набора инструментов v110 в Windows XP?

Ответ — нет. Все должно быть встроено в режим v110_xp, если вы хотите правильно запустить приложение в Windows XP.

5

Пожалуйста, не смешивайте библиотеки DLL, имеющие / экспортирующие классы, с разными версиями Visual Studio (даже с незначительными различиями версий). STL и MFC имеют классы, построенные на основе шаблонов (сами классы не могут быть шаблонизированы для пользователя), что предотвращает связывание и / или компиляцию между различными версиями.

Простой пример будет CString: статическая и динамическая связь с MFC будет иметь разные CString Реализации. Юникод и ANSI CStringс тоже разные. Другой пример — сама STL: отладочная сборка vector отличается от релизной сборки vector, Кроме того, в случае коллекций STL, настройки компилятора также изменят размер / реализацию контейнера (например, vector, list).

Поэтому лучше не импортировать экспортные классы / функции, имеющие эти типы классов в качестве параметров. Даже не передавайте их непрозрачным способом (как поверх пустого указателя).

1
По вопросам рекламы [email protected]