as

Settings
Sign out
Notifications
Alexa
Amazonアプリストア
Ring
AWS
ドキュメント
Support
Contact Us
My Cases
開発
設計と開発
公開
リファレンス
サポート

リンカー名前空間に関する問題の修正

リンカー名前空間に関する問題の修正

このページでは、ネイティブコードを含むVegaアプリをビルドして実行する場合に発生する可能性のある、リンカー名前空間に関する一般的な問題の解決策を示します。それぞれの問題には、エラーメッセージ、原因、詳細な解決手順が含まれています。

ビルドが「library found in package」というエラーで失敗する

エラーメッセージ:

Error: System library 'libpthread.so.0' found in package.This library is on the public ABI list and should be dynamically linked, not bundled.

原因: Vega OSの公開ABIリストにあるシステムライブラリがパッケージにバンドルされています。これらのライブラリは、バンドルするのではなく動的にリンクしてください。

解決策:

  1. バンドルされているライブラリをパッケージから削除します。

  2. ビルド構成を更新して動的にリンクします。

    # CMakeLists.txtの例
    target_link_libraries(your_app PRIVATE pthread)
    
  3. パッケージを再ビルドします。

    クリップボードにコピーしました。

    vega build
    
  4. ライブラリがバンドルされていないことを確認します。

    クリップボードにコピーしました。

    vega package list-libs <パッケージ.vpkg>
    

ランタイムエラー:「cannot open shared object file」

エラーメッセージ:

error while loading shared libraries: libcustom.so: cannot open shared object file: No such file or directory

原因: アプリが、パッケージにバンドルされていないサードパーティライブラリに依存しています。

解決策:

  1. ライブラリがVega OS公開ABIリストに含まれていないことを確認します。

  2. ライブラリをパッケージにバンドルします。

    # CMakeLists.txtの例
    find_library(CUSTOM_LIBRARY custom)
    install(FILES ${CUSTOM_LIBRARY} DESTINATION lib)
    
  3. パッケージを再ビルドし、再インストールします。

    クリップボードにコピーしました。

    vega build
    vega device install-app --packagePath <パッケージ.vpkg>
    

実行時にシンボル解決が失敗する

エラーメッセージ:

undefined symbol: custom_function

原因: アプリが、明示的な依存関係ではなくアンビエントシンボルに依存しています。

解決策:

  1. 解決されないシンボルがどのライブラリから提供されているかを特定します。

    クリップボードにコピーしました。

    nm -D <ライブラリ.so> | grep custom_function
    
  2. DT_NEEDEDまたはdlopen()を使用して、明示的な依存関係を追加します。

    # CMakeLists.txtの例
    target_link_libraries(your_app PRIVATE custom_library)
    
  3. パッケージを再ビルドします。

    クリップボードにコピーしました。

    vega build
    

ライブラリが間違った名前空間から読み込まれる

症状: ライブラリが正常に読み込まれているように見えても、ライブラリ関数を呼び出すと、アプリのクラッシュや予期しない動作が発生します。

原因: 動的リンカーにより、想定とは異なるバージョンのライブラリが読み込まれました。これは通常、次の原因で発生します。

  • dlopen()で完全修飾パスが使用された。
  • ライブラリ名が公開ABIリストに含まれているものと一致する。

解決策:

  1. dlopen()呼び出しで、非修飾のライブラリ名を使用します。

    // 正しい例
    dlopen("libutil.so.1", RTLD_NOW);
       
    // 間違った例:完全修飾パスは使用しないでください。
    dlopen("/pkg/lib/aarch64/libutil.so.1", RTLD_NOW);
    
  2. ライブラリが公開ABIリストに含まれていないことを確認します。含まれている場合は、常にシステムバージョンが読み込まれます。

  3. 実際のデバイスでテストして、ライブラリが正しく読み込まれることを確認します。

    クリップボードにコピーしました。

    vega device shell -d <デバイス>
    cat /proc/<pid>/maps | grep libutil
    

ABI検証は成功するが実行時に失敗する

症状: パッケージはビルド時のABI検証に合格しますが、アプリは実行時にリンカーエラーで失敗します。

原因: ビルド時の検証では、実行時のシナリオをすべて捕捉できるわけではありません。特に、次のようなシナリオは検出できません。

  • 実行時に構築される動的なdlopenのパス
  • アンビエントシンボルの依存関係
  • 実行時の状態に基づく条件付きのライブラリ読み込み

解決策:

  1. コード内で、動的にパスを構築しているdlopen()呼び出しをすべて削除します。

    // 問題のある例:パスが実行時に構築されます。
    char path[256];
    sprintf(path, "/pkg/lib/%s/libcustom.so", arch);
    dlopen(path, RTLD_NOW);
       
    // 適切な例:非修飾の名前を使用します。
    dlopen("libcustom.so", RTLD_NOW);
    
  2. 非修飾のライブラリ名を使用していることを確認します。

  3. 物理デバイスで十分にテストします。

  4. デバイスログにリンカーエラーがないかどうかを確認します。

    クリップボードにコピーしました。

    vega device shell -d <デバイス> logcat | grep linker
    

DT_NEEDEDエントリが見つからない

症状: アプリは正常にビルドされますが、実行時にシンボルが見つからないというエラーで失敗します。

原因: ビルド構成でライブラリの依存関係が正しく宣言されていないため、リンカーによるDT_NEEDEDエントリの追加が行われていません。

解決策:

  1. 現在のDT_NEEDEDエントリを確認します。

    クリップボードにコピーしました。

    readelf -d <ライブラリ.so> | grep NEEDED
    
  2. 不足している依存関係をビルド構成に追加します。

    # CMakeLists.txtの例
    target_link_libraries(your_app PRIVATE
        pthread
        m
        custom_library
    )
    
  3. 再ビルドし、DT_NEEDEDエントリが存在することを確認します。

    クリップボードにコピーしました。

    vega build
    readelf -d build/<アーキテクチャ>/<ライブラリ.so> | grep NEEDED
    

ライブラリバージョンが競合する

症状: アプリはVega仮想デバイスでは動作しますが、物理デバイスでは動作しません。または、その逆の状態になります。

原因: バンドルされているライブラリとシステムライブラリ、または仮想デバイス環境と物理デバイス環境の間でライブラリバージョンが異なっています。

解決策:

  1. パッケージにバンドルされているライブラリを確認します。

    クリップボードにコピーしました。

    vega package list-libs <パッケージ.vpkg>
    
  2. 動的にリンクする必要のあるライブラリがないかどうかを確認します。

    • バンドルされているライブラリを公開ABIリストと比較します。
    • 一致するものをすべて削除し、動的にリンクします。
  3. 仮想デバイスと物理デバイスの両方でテストして、一貫性を確認します。


Last updated: 2026年6月18日