Устраняет ли статическая библиотека проблемы искажения имен? - PullRequest
1 голос
/ 14 июня 2011

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

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

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

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

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

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

Ответы [ 3 ]

2 голосов
/ 14 июня 2011

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

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

1 голос
/ 14 июня 2011

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

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

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

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

0 голосов
/ 14 июня 2011

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

...