g ++ пытается (не удается) статически связать с libstdc ++ для общего объекта - PullRequest
3 голосов
/ 16 августа 2011

Я пытаюсь создать общий объект, используя несколько файлов .O, созданных с помощью команды -fPIC. Когда я запускаю g ++ с аргументом -shared, кажется, что он пытается статически связать библиотеку libstdc ++. A, что, конечно, не удается. Я пытаюсь понять, почему он автоматически пытается статически связать, когда я не использую аргумент -static-stdc ++.

когда я пытаюсь создать общий объект, я получаю сообщение об ошибке ... libstdc ++. A (ios) перемещает R_x86_64_325 в 'vtable for std :: ios_base': не может использоваться при создании общего объекта

Я запустил G ++ с аргументом -V и получил, и вижу, что LD получает аргумент -lstdc ++.

Ответы [ 2 ]

3 голосов
/ 16 августа 2011

При связывании одного общего объекта вам нужно сделать это из существующих .o файлов. Вы не можете сделать это из существующих .so файлов; это связало бы эти файлы .so с вашим файлом .so, но не в ваш файл .so. Таким образом, gcc ищет и находит архив .o файлов (.a) и пытается связать их. Но поскольку они не скомпилированы для перемещения (без -fPIC), их нельзя использовать для создания файлов .so.

Ваши варианты:

  • динамически связывает ваш .so с libstdc ++ (и таким образом делает его зависящим от файла .so, установленного в системе)
  • собрать файлы .o для libstdc ++ и скомпилировать их с -fPIC, а затем скомпилировать из этих файлов .so (здесь не имеет значения, используете ли вы файлы .o напрямую или архив ar)

Для первого (который я бы порекомендовал) варианта будет достаточно следующего (именно из make-файла, который я использую для создания файлов malloc / free с перехватом .so)

gcc -shared -lstdc++ -o your.so yourfiles.o
0 голосов
/ 16 августа 2011

Бьюсь об заклад, он сначала находит статическую библиотеку в пути поиска библиотеки, или ТОЛЬКО находит статическую библиотеку.Убедитесь, что соответствующая версия общей версии установлена ​​и может быть найдена.Вы, вероятно, можете truss запустить ваш g ++, чтобы отследить порядок, в котором он открывает библиотеки.

...