リンカー名前空間に関する問題の修正
このページでは、ネイティブコードを含む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リストにあるシステムライブラリがパッケージにバンドルされています。これらのライブラリは、バンドルするのではなく動的にリンクしてください。
解決策:
-
バンドルされているライブラリをパッケージから削除します。
-
ビルド構成を更新して動的にリンクします。
# CMakeLists.txtの例 target_link_libraries(your_app PRIVATE pthread) -
パッケージを再ビルドします。
vega build -
ライブラリがバンドルされていないことを確認します。
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
原因: アプリが、パッケージにバンドルされていないサードパーティライブラリに依存しています。
解決策:
-
ライブラリがVega OS公開ABIリストに含まれていないことを確認します。
-
ライブラリをパッケージにバンドルします。
# CMakeLists.txtの例 find_library(CUSTOM_LIBRARY custom) install(FILES ${CUSTOM_LIBRARY} DESTINATION lib) -
パッケージを再ビルドし、再インストールします。
vega build vega device install-app --packagePath <パッケージ.vpkg>
実行時にシンボル解決が失敗する
エラーメッセージ:
undefined symbol: custom_function
原因: アプリが、明示的な依存関係ではなくアンビエントシンボルに依存しています。
解決策:
-
解決されないシンボルがどのライブラリから提供されているかを特定します。
nm -D <ライブラリ.so> | grep custom_function -
DT_NEEDEDまたはdlopen()を使用して、明示的な依存関係を追加します。# CMakeLists.txtの例 target_link_libraries(your_app PRIVATE custom_library) -
パッケージを再ビルドします。
vega build
ライブラリが間違った名前空間から読み込まれる
症状: ライブラリが正常に読み込まれているように見えても、ライブラリ関数を呼び出すと、アプリのクラッシュや予期しない動作が発生します。
原因: 動的リンカーにより、想定とは異なるバージョンのライブラリが読み込まれました。これは通常、次の原因で発生します。
dlopen()で完全修飾パスが使用された。- ライブラリ名が公開ABIリストに含まれているものと一致する。
解決策:
-
dlopen()呼び出しで、非修飾のライブラリ名を使用します。// 正しい例 dlopen("libutil.so.1", RTLD_NOW); // 間違った例:完全修飾パスは使用しないでください。 dlopen("/pkg/lib/aarch64/libutil.so.1", RTLD_NOW); -
ライブラリが公開ABIリストに含まれていないことを確認します。含まれている場合は、常にシステムバージョンが読み込まれます。
-
実際のデバイスでテストして、ライブラリが正しく読み込まれることを確認します。
vega device shell -d <デバイス> cat /proc/<pid>/maps | grep libutil
ABI検証は成功するが実行時に失敗する
症状: パッケージはビルド時のABI検証に合格しますが、アプリは実行時にリンカーエラーで失敗します。
原因: ビルド時の検証では、実行時のシナリオをすべて捕捉できるわけではありません。特に、次のようなシナリオは検出できません。
- 実行時に構築される動的な
dlopenのパス - アンビエントシンボルの依存関係
- 実行時の状態に基づく条件付きのライブラリ読み込み
解決策:
-
コード内で、動的にパスを構築している
dlopen()呼び出しをすべて削除します。// 問題のある例:パスが実行時に構築されます。 char path[256]; sprintf(path, "/pkg/lib/%s/libcustom.so", arch); dlopen(path, RTLD_NOW); // 適切な例:非修飾の名前を使用します。 dlopen("libcustom.so", RTLD_NOW); -
非修飾のライブラリ名を使用していることを確認します。
-
物理デバイスで十分にテストします。
-
デバイスログにリンカーエラーがないかどうかを確認します。
vega device shell -d <デバイス> logcat | grep linker
DT_NEEDEDエントリが見つからない
症状: アプリは正常にビルドされますが、実行時にシンボルが見つからないというエラーで失敗します。
原因: ビルド構成でライブラリの依存関係が正しく宣言されていないため、リンカーによるDT_NEEDEDエントリの追加が行われていません。
解決策:
-
現在の
DT_NEEDEDエントリを確認します。readelf -d <ライブラリ.so> | grep NEEDED -
不足している依存関係をビルド構成に追加します。
# CMakeLists.txtの例 target_link_libraries(your_app PRIVATE pthread m custom_library ) -
再ビルドし、
DT_NEEDEDエントリが存在することを確認します。vega build readelf -d build/<アーキテクチャ>/<ライブラリ.so> | grep NEEDED
ライブラリバージョンが競合する
症状: アプリはVega仮想デバイスでは動作しますが、物理デバイスでは動作しません。または、その逆の状態になります。
原因: バンドルされているライブラリとシステムライブラリ、または仮想デバイス環境と物理デバイス環境の間でライブラリバージョンが異なっています。
解決策:
-
パッケージにバンドルされているライブラリを確認します。
vega package list-libs <パッケージ.vpkg> -
動的にリンクする必要のあるライブラリがないかどうかを確認します。
- バンドルされているライブラリを公開ABIリストと比較します。
- 一致するものをすべて削除し、動的にリンクします。
-
仮想デバイスと物理デバイスの両方でテストして、一貫性を確認します。
関連トピック
Last updated: 2026年6月18日

