CやC++で作ったプロジェクトだとsoファイルを読む込む関係から、lddコマンドという子を使って依存関係を調べる事ができます。
実際のところ
$ ./example_walk ./example_walk: error while loading shared libraries: liblcm.so.1: cannot open shared object file: No such file or directory
ためしにlddコマンドをみると、確かにliblcm.so.1がリンクしていません。
$ ldd example_walk linux-vdso.so.1 (0x00007fffc2fb7000) libunitree_legged_sdk_amd64.so => /home/shuzo/unitree_legged_sdk/lib/libunitree_legged_sdk_amd64.so (0x00007f9700b30000) liblcm.so.1 => not found libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f9700940000) libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f9700920000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f9700720000) libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f97005d1000)
PATHに通せばと思ったものの、上手くいかず。
ビルドしてるプロジェクトのlibフォルダに直接ブチ込むという荒治療。
$ cp ~/lcm-1.4.0/build/lcm/liblcm.so.1 ~/unitree_legged_sdk/lib/ $ ldd example_walk linux-vdso.so.1 (0x00007fffd51ce000) libunitree_legged_sdk_amd64.so => /home/shuzo/unitree_legged_sdk/lib/libunitree_legged_sdk_amd64.so (0x00007fdf4d1f0000) liblcm.so.1 => /home/shuzo/unitree_legged_sdk/lib/liblcm.so.1 (0x00007fdf4d1d0000) libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fdf4cfe0000) libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fdf4cfc0000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fdf4cdc0000) libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fdf4cc71000) libglib-2.0.so.0 => /lib/x86_64-linux-gnu/libglib-2.0.so.0 (0x00007fdf4cb30000) libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fdf4cb0d000) /lib64/ld-linux-x86-64.so.2 (0x00007fdf4d416000) libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007fdf4ca90000)
終わった後改めて調べたところ、lddの”標準的な場所”は以下の順で解決されるとのこと
‐ LD_LIBRARY_PATH (a.out プログラムでは LD_AOUT_LIBRARY_PATH)
- キャッシュファイル /etc/ld.so.cache
- デフォルトパスである /usr/lib、 次いで /lib。
今回の場合、liblcm.so.1 はLD_LIBRARY_PATHないし/usr/libに置けばよかったみたい。
参考もと
- man ldd
- Man page of ld.so