Я портирую существующую систему от Windows до Linux. Сборка структурирована с несколькими статическими библиотеками. Я столкнулся со связывающейся ошибкой, где символ (определенный в libA) не мог быть найден в объекте от libB. На строку компоновщика похожи
g ++ тест test_obj.o - lA-lB-o
Для проблемы, конечно, являющейся, что к тому времени, когда компоновщик находит его, нужен символ от libA, это уже прошло мимо него и не повторно сканирует, таким образом, он просто ошибки даже при том, что символ там для взятия.
Моя начальная идея состояла в том, чтобы, конечно, просто подкачать ссылку (к-lB - lA) так, чтобы libA был просканирован впоследствии, и любые символы, отсутствующие в libB, которые находятся в libA, взяты. Но затем я нахожу, что существует на самом деле рекурсивная зависимость между libA и libB! Я предполагаю, что компоновщик Visual C ++ обрабатывает это в некотором роде (это повторно сканирует по умолчанию?).
Способы иметь дело с этим я рассмотрел:
Используйте общие объекты. К сожалению, это - нежелательный с точки зрения требования компиляции PIC (это - производительность, которую чувствительный код и проигрывающий %ebx для содержания ПОЛУЧЕННЫЙ действительно повредил бы), и общие объекты не необходимы.
Создайте одну мега площадь всех объектов, избежав проблемы.
Реструктурируйте код для предотвращения рекурсивной зависимости (который является, очевидно, Правильным поступком, но я пытаюсь сделать этот порт с минимальными изменениями).
У Вас есть другие идеи иметь дело с этим? Есть ли некоторый способ, которым я могу убедить binutils компоновщика выполнять пересканирования библиотек, это уже посмотрело на то, когда это пропускает символ?
Просто сделайте следующее:
g++ test_obj.o -lA -lB -lA -o test
Когда компоновщик читает первую libA по команде строка, он отбросит в ней объект / символы, от которых еще никто не зависел, например все символы, необходимые libB, но не test_obj.o. Так что вы просто заставите его снова прочитать libA, и он также подберет эти символы.