'node-gyp'経由で渡されるリンカーコマンドラインオプションの使用私は、プログラムにリンクさせるライブラリパスとライブラリ名を指定します。しかし、結果として得られる実行ファイルは指定したファイルを参照しません。/usr/lib
の別の名前を参照します。なぜリンカは共有ライブラリ名を変更しますか?
binding.gyp
のライブラリセクションを使用してローカルのlib
ディレクトリを参照しています。
'libraries': [
'-lao-oboe',
'-L<(module_root_dir)/lib/',
'-Wl,-rpath-link,<(module_root_dir)/lib/',
'-Wl,-rpath,<(module_root_dir)/lib/'
],
node-gyp
私はlibao-oboe.so
が含まれていないものに-L
のパスを変更した場合、リンカは/usr/bin/ld: cannot find -la-oboe
を返すために正しくオプションを渡しているように見えます。要求されたライブラリの名前がlib
のものと異なるように変更すると、リンカはエラーも返します。
問題は、実行時にローカルライブラリがロードされないことです。 ldd
は、node-gyp
出力ファイルが指定されたファイルを参照していないことを示しています。別の名前のライブラリを参照しています - /usr/lib/liboboe-1.0.so.1
。 ldd
出力の2行目を参照してください。
linux-vdso.so.1 => (0x00007ffee20f5000)
liboboe-1.0.so.1 => /usr/lib/liboboe-1.0.so.1 (0x00007fa476377000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fa475ff5000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fa475c2b000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fa475a27000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fa47580a000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fa475501000)
/lib64/ld-linux-x86-64.so.2 (0x00007fa476922000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fa4752eb000)
ローカルライブラリのディレクトリが含まれています
lrwxrwxrwx 1 bruce bruce 15 Sep 8 02:50 libao-oboe.so -> libao-oboe.so.1`
-rw-r--r-- 2 bruce bruce 1640848 Aug 31 15:01 libao-oboe.so.1
これは、ローカルのライブラリファイルというケースで、libao-oboe.so.1
がで参照されているシステム・ライブラリ・ファイルと同じです実行可能ファイル(ldd
のように):/usr/lib/liboboe-1.0.so.1
。
リンカは、ローカルファイルが同じであることを何らかの形で(ハッシュまたは署名によって)認識し、標準の場所からライブラリファイルを置き換えますか?
node-gyp
の出力ファイルは、ビルドプロセスの一環として要求されなかったライブラリファイルを参照するのはなぜですか?
.soファイルの 'soname'フィールドは、-lオプションで指定されたファイル名を置き換えることになります。私は何が起こっているのか正確には分かりませんが、ファイル名をsonameと一致させると問題はありません。 – bmacnaughton