Как устранить конфликтующие зависимости компоновщика?
Если у меня есть две библиотеки, A.lib
а также B.lib
оба экспорт foo
а также bar
как сказать компоновщику использовать символ foo
от A.lib
и символ bar
от B.lib
?
3 ответа
Ты не можешь. Для вашего примера вы можете иметь определения из foo.lib
или же bar.lib
но не оба (особенно если вы не можете перекомпилировать библиотеки и установить видимость символов так, чтобы экспортировались только те символы, которые вы хотите). Порядок их привязки к вашему приложению будет зависеть от того, какие определения библиотеки используются (вам придется использовать научный метод, я думаю, первый из них связан с победами). Ответ Никласа Ханссона - отличный способ сделать это динамически, но, похоже, вы также не хотите изменять исходное приложение, чтобы динамически выбирать / выбирать, какие символы вынимать из библиотек.
Если вы действительно этого хотите, вы можете искажать таблицы символов с помощью шестнадцатеричного редактора, чтобы символы, которые вы не хотите экспортировать, имели разные имена (странно, но это сработало бы). Я знаю, что в Linux есть инструмент под названием objcopy
это позволит вам сделать это (не уверен насчет Windows).
Ты можешь использовать LIB.EXE /EXTRACT ...
извлечь только те объектные файлы, которые вы хотите использовать, и связать эти файлы с вашим собственным приложением.
Или вы можете использовать LIB
чтобы создать одну новую библиотеку, содержащую нужные вам элементы:
- Во-первых, используйте
/REMOVE
наA.LIB
удалятьbar.obj
:LIB.EXE /OUT:ANOBAR.LIB /REMOVE:bar.obj A.LIB
- Затем объединить
A.LIB
а такжеB.LIB
и убедитесь, что используетеANOBAR.LIB
как последний в командной строке, чтобы обеспечить егоfoo.obj
используется вместоB.LIB
"S:LIB.EXE /OUT:COMBINED.LIB B.LIB ANOBAR.LIB
Подробности можно найти здесь: Управление библиотекой, особенно абзац:
Вы можете использовать LIB [...] Чтобы заменить элемент библиотеки новым объектом, укажите библиотеку, содержащую объект-член, который должен быть заменен, и имя файла для нового объекта (или библиотеки, которая его содержит). Если объект с одинаковым именем существует в нескольких входных файлах, LIB помещает последний объект, указанный в команде LIB, в выходную библиотеку. При замене члена библиотеки обязательно укажите новый объект или библиотеку после библиотеки, содержащей старый объект.
Я не проверял данные командные строки, но в прошлом я часто использовал подобные.
Если вы используете динамические библиотеки, вы можете использовать динамическую загрузку и выбрать foo
от А и bar
от Б при загрузке.