Как иметь дело с рекурсивными зависимостями между статическими библиотеками с помощью binutils компоновщика?

Я портирую существующую систему от Windows до Linux. Сборка структурирована с несколькими статическими библиотеками. Я столкнулся со связывающейся ошибкой, где символ (определенный в libA) не мог быть найден в объекте от libB. На строку компоновщика похожи

g ++ тест test_obj.o - lA-lB-o

Для проблемы, конечно, являющейся, что к тому времени, когда компоновщик находит его, нужен символ от libA, это уже прошло мимо него и не повторно сканирует, таким образом, он просто ошибки даже при том, что символ там для взятия.

Моя начальная идея состояла в том, чтобы, конечно, просто подкачать ссылку (к-lB - lA) так, чтобы libA был просканирован впоследствии, и любые символы, отсутствующие в libB, которые находятся в libA, взяты. Но затем я нахожу, что существует на самом деле рекурсивная зависимость между libA и libB! Я предполагаю, что компоновщик Visual C ++ обрабатывает это в некотором роде (это повторно сканирует по умолчанию?).

Способы иметь дело с этим я рассмотрел:

  • Используйте общие объекты. К сожалению, это - нежелательный с точки зрения требования компиляции PIC (это - производительность, которую чувствительный код и проигрывающий %ebx для содержания ПОЛУЧЕННЫЙ действительно повредил бы), и общие объекты не необходимы.

  • Создайте одну мега площадь всех объектов, избежав проблемы.

  • Реструктурируйте код для предотвращения рекурсивной зависимости (который является, очевидно, Правильным поступком, но я пытаюсь сделать этот порт с минимальными изменениями).

У Вас есть другие идеи иметь дело с этим? Есть ли некоторый способ, которым я могу убедить binutils компоновщика выполнять пересканирования библиотек, это уже посмотрело на то, когда это пропускает символ?

15
задан Jack Lloyd 29 April 2010 в 14:49
поделиться

1 ответ

Просто сделайте следующее:

g++ test_obj.o -lA -lB -lA       -o test

Когда компоновщик читает первую libA по команде строка, он отбросит в ней объект / символы, от которых еще никто не зависел, например все символы, необходимые libB, но не test_obj.o. Так что вы просто заставите его снова прочитать libA, и он также подберет эти символы.

19
ответ дан 1 December 2019 в 02:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: