Я создаю С++-библиотеку с открытым исходным кодом, используя Visual Studio 2005. Я хотел бы предоставить готовые библиотеки вместе с исходным кодом. Эти библиотеки, созданные с помощью VS2005, также будут работать с более новыми версиями Visual Studio (например, VS Express Edition 2008)? Или мне нужно предоставить отдельные библиотеки на версию VS?
Созданы ли библиотеки С++ с разными версиями Visual Studio, совместимыми друг с другом?
Ответ 1
Если вы распространяете статические библиотеки, вы можете распространять библиотеки, зависящие от версии, в зависимости от того, что вы делаете. Если вы выполняете только вызовы в ОС, тогда вы можете быть в порядке. Возможно, функции RTL. Но если вы используете любые функции, классы или шаблоны стандартной библиотеки С++, то, вероятно, нет.
При распространении DLL вам понадобятся отдельные библиотеки для каждой версии VS. Иногда вам даже нужны отдельные библиотеки для различных уровней пакетов обслуживания. И, как уже упоминалось VolkerK, пользователям вашей библиотеки придется использовать совместимые настройки компилятора и компоновщика. И даже если вы все сделаете правильно, пользователям может потребоваться ссылка на другие библиотеки, которые каким-то образом несовместимы с вашими.
Из-за этих проблем, вместо того, чтобы тратить время на создание всех этих библиотек для ваших пользователей, я потратил бы время на то, чтобы сделать их максимально упрощенными, чтобы пользователи могли создавать их самостоятельно с минимальной суетой.
Ответ 2
Не нормально, нет. Библиотеки, созданные с помощью VS-инструментов, связаны с "Microsoft C Runtime" (называемым MSVCRT с последующим номером версии), который предоставляет стандартные функции библиотеки C и С++, и если вы попытаетесь запустить программу, требующую двух разных версий этой среды выполнения, будут происходить ошибки.
Вдобавок к этому, разные версии компилятора производят разный компилируемый код, а код из одной версии компилятора часто несовместим с другим, кроме как в самых тривиальных случаях (и если они вытолкнут один и тот же код, тогда будет нет смысла иметь разные версии:))
Ответ 3
В общем случае невозможно связать библиотеки, построенные с разными компиляторами, разные версии одного и того же компилятора и даже разные настройки одной и той же версии компилятора и получить рабочее приложение. (Хотя это может работать для определенных подмножеств языка и библиотеки std.) Нет стандартного двоичного интерфейса для С++ - даже не одного для некоторой общей платформы, как есть в C.
Для этого вам нужно либо обернуть свою библиотеку в API C, либо вам придется отправить двоичный файл для каждого компилятора, версии компилятора и настройки компилятора, которые вы хотите поддерживать.
Ответ 4
Если ваш проект библиотеки представляет собой статическую библиотеку, тогда вам придется предоставить сборку для каждой версии Visual Studio, в которой вы хотите, чтобы ваши пользователи были. В приведенном вами примере это эквивалентно предоставлению VS2005 и библиотека VS2008.
Если ваш проект библиотеки представляет собой динамическую библиотеку, то вы несколько уклоняетесь от проблем, но это означает, что пользователям необходимо убедиться, что они используют "Microsoft C Runtime", совместимые с вашей средой сборки. Вы можете исключить эти критерии, если вы статически связываете "Microsoft C Runtime" в своей динамической библиотеке.