Могу ли я использовать статическую библиотеку C++, скомпилированную Visual Studio 6, в Visual Studio 2008?

StackOverflow https://stackoverflow.com/questions/723416

Вопрос

Можно ли использовать статическую библиотеку C++ (.lib), скомпилированную с помощью Visual Studio 6, в Visual Studio 2008?

Это было полезно?

Решение

Я не должен думать, почему бы и нет - пока вы сохраняете обычные границы памяти CRT (т.е. если вы выделяете память внутри библиотечной функции, всегда освобождайте ее изнутри библиотеки - вызывая функцию в библиотеке для освобождения).

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

Другие советы

Это действительно зависит.Предоставляет ли библиотека только «внешние функции C», где память либо управляется прямыми методами Win32 (CoTaskMemAlloc и т. д.), либо вызывающая сторона никогда не освобождает память, выделенную вызываемой стороной, или наоборот?Вы полагаетесь только на базовые библиотеки, которые не сильно изменились со времен VS 6?Если так, то с вами все будет в порядке.

Есть 2 основные вещи, на которые следует обратить внимание.Изменения в глобальных переменных, используемых сторонними библиотеками, а также изменения в структуре структур, классов и т. д., определенных этими сторонними библиотеками.Например, распределитель памяти CRT, вероятно, изменил свои структуры управления скрытым распределением между двумя версиями, поэтому если одна версия библиотеки выделяет часть памяти, а другая освобождает, это, вероятно, приведет к сбою.

Другой пример: если вы предоставляете классы C++ через интерфейс, и они полагаются на библиотеки времени выполнения MS, такие как MFC, есть вероятность, что макет класса изменился между VS 6 и VS 2008.Это означает, что доступ к члену/полю класса может привести к неправильным результатам и привести к непредсказуемым результатам.Вы, вероятно, в шоке, если .lib использует MFC в каком-либо качестве.MFC определяет и внутренне использует множество глобальных переменных, и любой доступ к глобальным переменным MFC с помощью операций в .lib может привести к сбоям, если инфраструктура MFC изменилась в среде хостинга (она сильно изменилась со времен VS 6, кстати).

Я не исследовал, какие именно изменения были внесены в заголовки MFC, но я видел непредсказуемое поведение между двоичными файлами классов на основе MFC/ATL, скомпилированными в разных версиях VS.

Помимо этих проблем, существует риск для таких функций, как strtok(), которые полагаются на статические глобальные переменные, определенные в библиотеках времени выполнения.Я не уверен, но меня беспокоит, что эти статические переменные могут не инициализироваться должным образом, если вы используете клиент, ожидающий однопоточного CRT в потоке, созданном в многопоточном CRT.Дополнительную информацию см. в документации по _beginthread().

Да.С этим вообще не должно быть никаких проблем.Как gbjbaanb Как уже упоминалось, вам нужно следить за своей памятью, но VS2008 все равно будет с ней работать.Если вы не пытаетесь смешивать с ним CLR (управляемый) код.Я бы рекомендовал против этого, если это вообще возможно.Но если вы говорите о необработанном коде C или C++, то, конечно, он сработает.

Что именно вы планируете использовать?(Что находится в этой библиотеке?) Вы уже пробовали ее, но возникли проблемы, или вы просто проверяете, прежде чем тратить кучу времени, пытаясь заставить работать что-то, что просто не работает?

Конечно, это сработает.

Вы спрашиваете, где в VS2008 кодировать ссылки?

Если да, перейдите в proj props -> Linker -> Input on Configuration на страницах свойств.Найдите «дополнительные зависимости» и напишите там код .LIB.

Перейдите в proj props -> Linker -> General и закодируйте путь к библиотекам в «Дополнительных каталогах библиотек».

Это должно сработать!!

Бывают случаи, когда ответ отрицательный, когда мы переходили с VS6 на VS2k5, нам приходилось пересобирать все наши библиотеки, так как изменилась модель памяти и функции CRT были другими.

Между VC6, VS2003, VS2005 и VS2008 было несколько серьезных изменений.Visual C++ (в VS2005) прекратил поддержку однопоточной статически связанной библиотеки CRT.Перечислены некоторые критические изменения здесь и здесь.Эти изменения повлияют на использование вами встроенных библиотек VC6 в более поздних версиях.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top