Как устранить конфликтующие зависимости компоновщика?

Если у меня есть две библиотеки, 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 от Б при загрузке.

Другие вопросы по тегам