Я работаю в большом проекте. И теперь сталкиваются с ошибкой ссылки.
Эту ошибку можно избежать с помощью обходного пути, но я не могу понять, почему она работает.
Вот структура файла, связанная с моей проблемой:
project
|-package_a
|--a.cpp
|--...
|-package_b
|--b.cpp
|--c.cpp
|--...
|-package_others
Все * .o в package_a будут упакованы в a.a и * .o в package_b
будет упакован в б.а
"g++ -o exec -Bstatic b.a a.a ..."
используется для генерации двоичного файла.
В package_b / b.cpp я добавил функцию foo ().
И в package_a / a.cpp я использовал эту функцию.
Но здесь я получу ошибку ссылки, говорящую о неопределенной ссылке на foo () в a.o
Я могу проверить (по objdump), что foo () уже в b.o.
Изменив команду link на "g++ -o exec -Bstatic a.a b.a ..."
, двоичный файл может быть успешно собран. Теперь я понимаю, что компоновщик заботится о порядке в списке ссылок. Но, пожалуйста, поймите, что это большой проект. У меня нет разрешения на изменение конфигурации проекта, поэтому необходимо сохранить исходный порядок ссылок.
Затем я добавил фиктивную функцию bar () в package_b / c.cpp, которая ничего не делает
но просто вызов foo (), тогда будет запущен оригинальный "g++ -o exec -Bstatic b.a a.a ..."
без ошибок связи.
Может кто-нибудь показать мне немного света, почему просто добавление фиктивной функции в
тот же пакет будет работать в этом случае?
Я использую g ++ 4.4.4 и linux 2.6.18-194.el5
Любой комментарий будет оценен