Избегает ли статическая библиотека проблем с искажением имен?

У меня есть приложение C ++ \ MFC, написанное в Visual Studio 2003 SP1, ссылки на внешнюю статическую библиотеку SomeExtStaticLib.lib. Я также включаю файлы заголовков, поставляемые с SomeExtStaticLib.lib, для создания объектов в моем приложении.

SomeExtStaticLib.lib - статическая библиотека, созданная с помощью VC6.

Теперь я переношу свое приложение на Visual Studio 2008.

У меня очень простой вопрос.

Следует ли мне также перенести "SomeExtStaticLib.lib" в скомпилированный VS2008? Когда я попытался использовать этот скомпилированный VC6 "SomeExtStaticLib.lib" в моем скомпилированном VC9 приложении, он не выдавал никаких ошибок компоновщика. Я ожидал по крайней мере некоторых проблем с искажением имен.

Устраняют ли статические библиотеки проблемы с искажением имен?


person aJ.    schedule 14.06.2011    source источник


Ответы (3)


Проблема не в статическом и динамическом связывании и не в искажении имен. Проблема заключается в двоичной совместимости всего, что используется в интерфейсе. Таким образом, например, если я сильно не ошибаюсь, определение std::string изменилось между VC6 и VC9 с другим макетом. Поэтому, если в каком-либо коде используется std::string, вам придется перекомпилировать, иначе во время выполнения будут возникать странные и необъяснимые ошибки.

В общем, лучше предполагать отсутствие двоичной совместимости, если задействованы разные версии компилятора или даже разные варианты компиляции, если производитель не гарантирует иное. (Хотя некоторый здравый смысл в порядке: вы можете свободно смешивать параметры, которые, например, управляют только предупреждениями. Но остерегайтесь /Ds, которые вызывают или не генерируют добавленный отладочный код.)

person James Kanze    schedule 14.06.2011
comment
дело не только в интерфейсе - вероятно, изменилось и распределение и освобождение памяти. Это означает, что как только вы освобождаете память, выделенную в библиотеке, или библиотека освобождает выделенную вами память, происходят неопределенные вещи. Сюда входят исключения, которые выделяются там, где они выбрасываются, и освобождаются там, где они пойманы. - person Tobias Langner; 14.06.2011
comment
@Tobias Langner Это зависит от того, как вы скомпилировали и скомпилировали. Если вы используете /MD или /MDd, это не должно быть проблемой. (По крайней мере, я так не думаю.) - person James Kanze; 14.06.2011

Если приложение не изменилось, ему потребуется тот же набор символов из библиотеки. И, следовательно, возможно, вы можете ссылаться на библиотеку, скомпилированную с помощью VC6.0. Изменение имени не является проблемой, если и приложение, и библиотека не совпадают с совместимыми (рабочими) в VC6.0.

Следует ли мне также перенести SomeExtStaticLib.lib на скомпилированный VS2008?
Между VC6.0 и Visual 2008 есть проблемы совместимости. Итак, ДА вы следует перестроить вашу библиотеку с помощью Visual 2008.

То, что вы можете ссылаться на библиотеку как есть, не означает, что она будет работать правильно.

Устраняют ли статические библиотеки проблемы с искажением имен?
Не совсем. Они вообще ничего особенного не делают.

person Alok Save    schedule 14.06.2011

Статические библиотеки не имеют ничего общего с изменением имени или без него .... если ваш код написан на C ++, есть искажение, а если его C (или внешний "C" в C ++), то искажения нет. Пока библиотека и код, который ее связывает, согласованы, нет проблем с линковкой в ​​библиотеке.

person mah    schedule 14.06.2011