Как устранить конфликтующие зависимости компоновщика? - PullRequest
8 голосов
/ 23 января 2012

Если у меня есть две библиотеки, A.lib и B.lib, обе из которых экспортируют foo и bar, как я могу сказать компоновщику использовать символ foo из A.lib и символ bar из B.lib?

Ответы [ 3 ]

3 голосов
/ 23 января 2012

Вы не можете. Для вашего примера вы можете иметь определения от foo.lib или bar.lib, но не от обоих (особенно, если вы не можете перекомпилировать библиотеки и установить видимость символов так, чтобы экспортировались только те символы, которые вы хотите). Порядок их привязки к вашему приложению будет зависеть от того, какие определения библиотеки используются (вам придется использовать научный метод, я думаю, первый из них связан победами). Ответ Никласа Ханссона - отличный способ сделать это динамически, но, похоже, вам также не нужно изменять исходное приложение, чтобы динамически выбирать / выбирать символы для извлечения из библиотек.

Если вы действительно хотите, вы можете искажать таблицы символов с помощью шестнадцатеричного редактора, чтобы символы, которые вы не хотели экспортировать, имели разные имена (хак, но это сработало бы). Я знаю, что в Linux есть инструмент под названием objcopy, который позволит вам сделать это (не уверен в Windows).

3 голосов
/ 23 января 2012

Вы можете использовать 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:LIB.EXE /OUT:COMBINED.LIB B.LIB ANOBAR.LIB

Подробности можно найти здесь: Управление библиотекой , особенно абзац:

Вы можете использовать LIB [...] Длязамените элемент библиотеки новым объектом, укажите библиотеку, содержащую заменяемый объект-член, и имя файла для нового объекта (или библиотеки, в которой он содержится).Если объект с одинаковым именем существует в нескольких входных файлах, LIB помещает последний объект, указанный в команде LIB, в выходную библиотеку.При замене члена библиотеки обязательно укажите новый объект или библиотеку после библиотеки, которая содержит старый объект.

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

1 голос
/ 23 января 2012

Если вы используете динамические библиотеки, вы можете использовать динамическую загрузку и выбрать foo из A и bar из B при загрузке.

...