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

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

Ответы [ 4 ]

18 голосов
/ 21 октября 2009

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

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

16 голосов
/ 21 октября 2009

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

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

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

7 голосов
/ 21 октября 2009

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

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

2 голосов
/ 06 января 2017

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...