Когда я компилирую программу на 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, а не символически связать их?
Похоже, вы создаете свой собственный GCC.
Вам нужно либо передать этот путь вручную компоновщику, либо настройте свой собственный GCC, чтобы сделать это для вас через файл спецификации.
Не позволяйте загрузчику искать библиотеки, используйте опцию -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