C ++ Почему эта конкретная ситуация вызывает ошибку связывания символов? - PullRequest
1 голос
/ 12 сентября 2011

Я работаю над приложением, в котором есть «ядро» и несколько плагинов. Я использую Qt в Linux и использую систему загрузки плагинов Qt. Плагины создаются как общие объектные файлы (* .so) и загружаются динамически. Если я ссылаюсь на библиотеку с помощью плагина, а эта библиотека ссылается на дополнительные библиотеки, я часто получаю ошибку «неопределенный символ» из приложения. Чтобы обойти это, мне нужно связать плагин с дополнительными библиотеками ...

Плагин связывает с LibA

LibA ссылки на LibB, LibC

LibA скомпилирован как статический. Когда я пытаюсь загрузить плагин, я получаю неопределенную символьную ошибку, например:

unable to load shared library 'myPluginName.so':
myPluginName.so: undefined symbol: _ZN3BlahBlahD2Ev

Чтобы исправить это, я могу воспользоваться фильтром, чтобы разобрать имя символа, выяснить, к какой lib принадлежит символ (скажем, LibB), а затем скомпилировать как:

Плагин связывает с LibA, LibB

LibA ссылается на LibB, LibC

Я не знаю, почему возникает ошибка. Если LibA ссылается на LibB и LibC, почему плагин должен «знать» и о LibB? Почему эта ошибка не возникает во всех случаях (т.е. нет ошибок, связанных с неопределенными символами в LibC)?

Буду признателен за любой вклад.

-kf

Ответы [ 2 ]

3 голосов
/ 12 сентября 2011

Вы должны иметь в виду, что статическая библиотека - это не что иное, как набор объектных файлов, упакованных вместе в один файл.Если вашему плагину требуется LibA, а LibA нужны LibB и LibC, то, когда вы связываете свой плагин, вы должны указать компоновщику, где находятся LibA, LibB и LibC.

Если вы работаете с динамическими библиотеками, это будет другойистория..So уже связан, поэтому все его ссылки уже разрешены.Если бы LibA была динамически связанной библиотекой, тогда ваш плагин должен был бы связываться только с LibA.so, поскольку уже был выполнен шаг связывания, чтобы связать LibA с его собственными зависимостями.

1 голос
/ 12 сентября 2011

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

Рассмотрим случай:

  • libA зависит от libB и libC
  • => libB зависит от libD
  • => libC зависит от libD

По крайней мере, это мой опыт в мире MSVS.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...