2010-05-04 2 views
3

Как вы определяете в Visual Studio 2010 порядок, в котором файлы библиотек должны быть связаны?Ссылка на библиотеку Visual Studio 2010

У меня есть проект, который ссылается на libexpat и на другую библиотеку. Эта библиотека (не под моим контролем), похоже, также включает libexpat. Проблема в том, что «мы» используем другую версию библиотеки (XML_UNICODE vs not). В Visual Studio 2008 все показалось, что все в порядке (возможно, это совпадение), но в Visual Studio 2010 неверный экземпляр libexpat связан. Я думал, что если бы я мог указать порядок, в котором эти две библиотеки должны быть связаны, тогда я мог бы обойти проблему.

ответ

5

Я нашел решение «a»: если вы добавляете библиотеки через #pragma comment(lib..., порядок связывания совпадает с порядком, в котором вы вводите эти прагмы. Я все еще оставляю вопрос открытым для решения, когда библиотеки добавляются через файл проекта, а не через инструкции pragma.

1

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

Однако тот факт, что он работал раньше, может означать, что одна библиотека имеет все функциональные возможности другого плюс дополнительные. Я не знаю деталей экспата. Если это так, вам нужно убедиться, что у вас есть только версия, которую вы хотите использовать в пути поиска библиотеки. Другой порядок поиска в другой версии компилятора может объяснить изменение в поведении.

+0

I подумал о создании DLL, но поскольку «другая» библиотека является библиотекой защиты аппаратного ключа, я действительно не хочу этого делать :-) –

0

Я думаю, вы можете изменить порядок, в котором файлы библиотек связаны между собой, добавив их в файл проекта в linker -> input -> дополнительные зависимости. Файлы библиотеки будут связаны в том порядке, в котором они указаны.

7

Несколько лет назад я обнаружил хак, который позволяет заставить Visual C++ связывать библиотеки с определенным приоритетом. Это не изящно, но функционально.

Похоже, что компоновщик для Visual C++ генерирует порядок ссылок «на лету» на основе зависимостей символов. Добавляя ссылку на символ вверх, вы можете заставить компоновщик включить первую библиотеку, указанную в вводе компоновщика. Обратите внимание, что я тестировал это только с Visual C++ 6 и 8 (2005).

Допустим, например, что у вас есть две библиотеки с символом XML_ParserCreate:

  • libexpat.lib - XML_ParserCreate
  • someother.lib - OtherSymbolsYouNeed, XML_ParserCreate

Во-первых, заказ вашей библиотеки как и следовало ожидать, libexpat.lib, а затем someother.lib. Через командную строку это будут опции: link.exe. В Visual Studio 2005 они будут доступны в настройках проекта -> Linker -> Input -> Additional Dependencies. Я бы предположил, что Visual C++ 2010 имеет аналогичное меню.

Затем добавьте параметр командной строки, который определяет известный повторный символ вверх, используя опцию компоновщика /INCLUDE.В Visual Studio 2005, это может быть добавлен в свойствах проекта Configuration -> Linker -> Командная строка -> Дополнительные опции:

/out some.exe ... libexpat.lib someother.lib 
/include:XML_ParserCreate 

Определение этого символа будет вызывать компоновщик сразу предпочитают первую библиотеку который завершает (реализует) его. В общем случае Visual C++ генерирует ошибку с повторяющимися символами; если вы еще этого не сделали, убедитесь, что вы также указали вариант компоновщика /FORCE:MULTIPLE.

Моя особая потребность в этом была в использовании библиотеки отладки памяти DUMA. Он определяет множество функций памяти, которые также определены в libcmtd.lib. Ниже будет неправильно связывать версию libcmtd по _malloc, несмотря на заказ библиотеки, которая, кажется, наоборот:

/out some.exe ... duma.lib libcmtd.lib 
/FORCE:MULTIPLE 

Эта проблема была решена вручную путем добавления символа, и надежно работал в течение многих лет:

/out some.exe ... duma.lib libcmtd.lib 
/INCLUDE:_malloc /FORCE:MULTIPLE 
Смежные вопросы