Как мне получить информацию из g ++ COLLECT_LTO_WRAPPER в файл .so, сгенерированный make?

Когда я компилирую программу на C ++, используя g ++ из командной строки, а затем делаю ldd a.out LDD является смог найти libstdc ++. a (libstdc ++. so.6)

Когда я строю расширение C ++ ruby ldd myext.so не могу найти libstdc ++. a (libstdc ++. so.6) и require 'myext' не удается загрузить, с жалобой на невозможность найти libstdc ++.

Если я запускаю g ++ -v, я вижу следующий вывод:

COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=/big_long_path....
Target: powerpc-ibm-aix7.1.0.0
Configured with: ../gcc-4.8.2/configure .....
Thread model: aix
gcc version 4.8.2 (GCC)

Теперь, если я установлю свой LIBPATH включить этот big_long_path

export LIBPATH=/big_long_path....:$LIBPATH

ldd myext.so

является смог найти libstdc ++ и мой require 'myext' работает (возвращает true)

Это может быть хорошо, но я бы не хотел, чтобы пользователи гадали со своей LIBPATH. Есть ли что-то, что я могу добавить в мой Makefile, чтобы позволить сгенерированному myext.so найти libstdc ++ (и libgcc) в расположении, указанном в той большой_long_path, которую я вижу в строке COLLECT_LTO_WRAPPER, которую я вижу, когда я запускаю g ++ -v?

Обновить

Первая ссылка в принятом ответе ниже действительно помогла мне понять, что происходит, и я смог получить ldd, чтобы не жаловаться на libstdc ++, добавив -blibpath: big_long_path: / usr: / usr / lib к LDFLAGS в Makefile.

Но по какой-то причине, когда ruby ​​попытался загрузить ext, он все равно не удался. Это заставило меня думать, что рубин каким-то образом настраивал ЛИБАТУ. В конце концов, моим решением было поместить символическую ссылку на libstdc ++ и libgcc_s в каталог lib установки ruby. Мысль была о том, что ruby ​​должен был искать общие объекты расширения, поэтому я решил, что воспользуюсь этим и поместу эти две библиотеки в путь, который должен искать ruby. Единственное, что мне интересно, это то, что я должен просто скопировать libstdc ++ и libgcc_s, а не символически связать их?

1

Решение

Другие решения

Не позволяйте загрузчику искать библиотеки, используйте опцию -Wl, -bipath; проверить результат с dump -X32_64 -H; вы должны увидеть что-то вроде этого:

INDEX  PATH                          BASE                MEMBER
0      /usr/local/lib:/usr/lib:/lib
1      /usr/local/lib                libapr-1.so.0
2      /usr/local/lib                libaprutil-1.so.0
3      /usr/local/lib                libcrypto.so.1.0.1f
4      /usr/local/lib                libexpat.so.1
5      /usr/local/lib                libgcc_s.a          shr.o
6      /usr/local/lib                libiconv.so.2
7      /usr/local/lib                libssl.so.1.0.1f
8      /usr/local/lib                libcpotlas.so.1
9      /usr/lib                      librtl.a            shr.o
10     /usr/lib                      libc.a              shr.o
11                                   .   

Также я должен сказать, что использование C ++ для плагина — очень плохая идея, особенно в экзотических системах, таких как AIX

0

По вопросам рекламы [email protected]