Совместимы ли библиотеки C++, созданные в разных версиях Visual Studio, друг с другом?

Я создаю библиотеку C++ с открытым исходным кодом, используя Visual Studio 2005. Я хотел бы предоставить готовые библиотеки вместе с исходным кодом. Будут ли эти библиотеки, созданные на VS2005, работать с более новыми версиями Visual Studio (особенно VS Express Edition 2008)? Или мне нужно предоставить отдельные библиотеки для каждой версии VS?

4 ответа

Решение

Если вы распространяете статические библиотеки, вы можете распространять независимые от версии библиотеки, в зависимости от того, что именно вы делаете. Если вы только делаете звонки в ОС, то вы можете быть в порядке. С функциями RTL, может быть. Но если вы используете какие-либо функции, классы или шаблоны стандартной библиотеки C++, то, вероятно, нет.

При распространении DLL вам понадобятся отдельные библиотеки для каждой версии VS. Иногда вам даже нужны отдельные библиотеки для различных уровней пакета обновления. И, как упомянул VolkerK, пользователи вашей библиотеки должны будут использовать совместимые настройки компилятора и компоновщика. И даже если вы все делаете правильно, пользователям может понадобиться установить связь с другими библиотеками, которые каким-то образом несовместимы с вашей.

Из-за этих проблем вместо того, чтобы тратить время на сборку всех этих библиотек для ваших пользователей, я бы потратил время на то, чтобы сделать их как можно более простыми, чтобы пользователи могли создавать их самостоятельно с минимальными усилиями.

Не нормально, нет. Библиотеки, созданные с помощью инструментов VS, связаны с "Microsoft C Runtime" (называемой MSVCRT, за которой следует номер версии), которая предоставляет стандартные библиотечные функции C и C++, и если вы попытаетесь запустить программу, для которой требуются две разные версии этой среды выполнения, то ошибки будут возникать.

Кроме того, разные версии компилятора производят различный скомпилированный код, и код из одной версии компилятора часто несовместим с другой, за исключением самых тривиальных случаев (и если они производят один и тот же код, то не будет смысла иметь разные версии:))

Как правило, невозможно ссылаться на библиотеки, созданные с использованием разных компиляторов, разных версий одного и того же компилятора и даже разных настроек одной и той же версии компилятора, и получить работающее приложение. (Хотя это может работать для определенных подмножеств языка и библиотеки std.) Для C++ нет стандартного бинарного интерфейса - даже для некоторой общей платформы, как в C.

Чтобы достичь этого, вам нужно либо обернуть свою библиотеку в C API, либо вам придется поставлять двоичный файл для каждого компилятора, версии компилятора и настроек компилятора, которые вы хотите поддерживать.

Если ваш библиотечный проект является статической библиотекой, то вам нужно будет предоставить сборку для каждой версии Visual Studio, в которой вы хотите, чтобы ваши пользователи находились. В приведенном вами примере это равносильно предоставлению как библиотеки VS2005, так и библиотеки VS2008.,

Если ваш библиотечный проект представляет собой динамическую библиотеку, то вы несколько избегаете проблем, но это означает, что пользователям необходимо убедиться, что они используют "Microsoft C Runtime", совместимую с вашей средой сборки. Вы можете исключить этот критерий, если будете статически связывать "Microsoft C Runtime" с вашей динамической библиотекой.

Другие вопросы по тегам