.lib, созданный с VS2008, используемый двоичным файлом, созданным с VS2005 - PullRequest
1 голос
/ 04 января 2012

Что может помешать мне связываться со сторонним .lib, созданным с помощью Visual Studio 2008 в программе, которую я компилирую с Visual Studio 2005?Спасибо

Ответы [ 2 ]

2 голосов
/ 04 января 2012

Обновление: Это относится только к DLL, что было первоначальным вопросом. Со статическими библиотеками вся надежда потеряна.

Я попытаюсь обобщить несколько фактов:

  • Сам ABI совместим, поэтому любой код, который использует одинаковые определения для всех типов данных и сигнатур функций, подходит, , но
  • Возможно, изменились определения внутренней структуры системы и системные файлы, за исключением
  • Части ABI определены как фиксированные или обратно совместимые.

Таким образом, безопасно вызывать функции и методы, передавая типы данных, которые полностью (то есть включая их члены) определены

  • в заголовочных файлах, соответствующих DLL, или
  • в файле IDL (поскольку они никогда не изменяются после публикации), или
  • в другом заголовочном файле, включая системные заголовки, если определение гарантированно будет зафиксировано

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

Теперь сложная часть:

  • Внутренние структуры данных системного распределителя не являются частью неизменного набора. Поскольку указатель на выделенную память также является указателем на структуру выделения, непосредственно предшествующую ему, применяется правило никогда не разыменования. Таким образом:
    • небезопасно освобождать память, которая была передана, за исключением CoTaskMemAlloc() / CoTaskMemFree().
    • виртуальный деструктор может быть вызван, только если объект был создан внутри DLL (здесь учитывается new-expression , а не экспортируется ли конструктор)
    • не виртуальный деструктор может быть вызван только в том случае, если объект был создан вне DLL.
  • STL не является частью неизменяемого набора, поэтому любые struct, содержащие типы STL, небезопасны.
...