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