特定のバージョンのコンパイラでコンパイルするために、Linuxシステムにはさまざまなツールチェーンディレクトリがあります。リンカー(ツールチェーンディレクトリにあります)がツールチェーン(/ toolchain / lib / ...)のライブラリファイルではなく、メインコンピュータ(/ libなど)からライブラリファイルを選択するという問題があります。これにより、次のようなさまざまなリンカーエラーが発生する可能性があります。
/opt/foo/cross_x86_64_v9b/lib/gcc/x86_64-linux/9.2.0/../../../../bin/x86_64-linux-ld: /lib/x86_64-linux-gnu/libxmlrpc_client.so.3: undefined reference to `curl_easy_getinfo@CURL_OPENSSL_4'
/opt/foo/cross_x86_64_v9b/lib64/libxmlrpc_client.so.3(ツールチェーンバージョン)の代わりに/lib/x86_64-linux-gnu/libxmlrpc_client.so.3(私のUbuntuのデフォルトファイル)に接続されているため、リンクは失敗します。
私が知る限り、検索パスは次のとおりです。
/opt/foo/cross_x86_64_v9b/bin/x86_64-linux-ld --verbose | grep SEARCH_DIR
SEARCH_DIR("/opt/foo/cross_x86_64_v9b/x86_64-linux/lib64"); SEARCH_DIR("/opt/foo/cross_x86_64_v9b/lib64"); SEARCH_DIR("/opt/foo/cross_x86_64_v9b/lib"); SEARCH_DIR("/opt/foo/cross_x86_64_v9b/x86_64-linux/lib");
/lib/x86_64-linux-gnu から libxml... ファイルを削除すると接続が成功するため、上記の SEARCH_DIR より前にそのパスが検索されます。リンクされているすべてのシステムライブラリは/opt/foo/cross_x86_64_v9bの下になければなりません。
私の環境では、LD_PATHとLD_LIBRARY_PATHは定義されていません。リンカーが/opt/foo/cross_x86_64_v9b/lib64/の前に/libを検索するのはなぜですか?この問題をどのように解決できますか?
答え1
考慮すべき2つの簡単なアイデア:
構成中に指定したlibパスがこのパスリストに
binutils
追加されます。SEARCH_DIR
順番にどこに配置されているかは正確にはわかりませんが、設定やインストール時にオプションを含めておくと簡単に確認できます。--with-lib-path=/opt/foo/cross_x86_64_v9b/lib64
libc.so
とで検索パスを手動で編集できますlibm.so
。これは別のエラーを引き起こす可能性があるので注意してください。cp -uv /opt/foo/cross_x86_64_v9b/lib/libc.so{,.orig} cp -uv /opt/foo/cross_x86_64_v9b/lib/libm.so{,.orig} sed -e 's@/path1@/path2@g' /opt/foo/cross_x86_64_v9b/lib/libc.so.orig > /opt/foo/cross_x86_64_v9b/lib/libc.so sed -e 's@/path1@/path2@g' /opt/foo/cross_x86_64_v9b/lib/libm.so.orig > /opt/foo/cross_x86_64_v9b/lib/libm.so diff /opt/foo/cross_x86_64_v9b/lib/libc.so{,.orig} diff /opt/foo/cross_x86_64_v9b/lib/libm.so{,.orig}