Могу ли я использовать скомпилированную статическую библиотеку C ++ для Visual Studio 6 в Visual Studio 2008? - PullRequest
4 голосов
/ 07 апреля 2009

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

Ответы [ 6 ]

5 голосов
/ 07 апреля 2009

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

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

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

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

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

3 голосов
/ 07 апреля 2009

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

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

1 голос
/ 07 апреля 2009

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

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

0 голосов
/ 09 мая 2009

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

0 голосов
/ 07 апреля 2009

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

0 голосов
/ 07 апреля 2009

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

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

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

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

Это должно сделать это !!

...