2017-11-02 4 views
2

タイトルは正しかったので、私の状況を説明しましょう:ヘッダーファイルを使用してダイナミックライブラリのロードを正しく設定するにはどうすればよいですか?

別のチームがライブラリを開発しています。彼らはヘッダーファイルと*.soファイルを発送します。ヘッダーファイルは私たちに利用可能であり、私たちはそれを自分のコードに組み込み、望むならそれを使うことができます。しかし、*.soは、私たちが運営するプラットフォームに同梱されています。当社のソフトウェアの構築時にこの*.soにアクセスすることはできません。このため、リンカはある時点で*.soが利用可能であると予想しているので、実際にはヘッダファイルも使用できません。

今は、実行時に*.soファイルをロードし、次にdlsym()を使用して関数を名前で検索し、それらを関数ポインタにマップするラッパークラスを作成します。

これは唯一のオプションですか?私はヘッダーファイルを使用することができますが、リンカーにビルド時にシンボルを解決しないように指示しますが、代わりに実行時に*.soファイルをロードするチャンスがあった後にそれらを解決しようとしますか?

ここで実際のプラットフォームはAndroid(NDK経由)ですが、一般的なLinuxのアドバイスはこの場合POSIX APIが利用可能であることを期待しています。

答えて

1

あなたは優先順に、いくつかのオプションがあります:

  1. がメンテナからライブラリを取得します。ヘッダーは提供していますが、ライブラリではありません(少なくともNDKの図書館のようなスタブ・ライブラリーは機能しません)。
  2. 独自のスタブライブラリを作成します。公開するシンボルのリストがあれば簡単です。 int foo; void bar() {}をCファイルに入れて、公開する必要があるすべての変数と関数を共有ライブラリとして構築します。バージョンスクリプトにシンボルのリストがある場合は、Androidのgen_stub_libs.pyを使用してそれを行うことができます。
  3. ヘッダーファイルにすべてのシンボルを__attribute__((weak))とマークします。リンカーは、彼らが行方不明であると不平を言うことはありません。実行時にそれらが見つからない場合、ライブラリはロードされますが、各関数のアドレスはnullptrになります。ライブラリの定義が間違っている場合は、ビルド時の失敗をランタイムエラーに変えますが、これは便利な場合もあります。if (foo) { foo(); }と同様に機能の可用性をチェックする方が簡単なためです。 dlsym
  4. ldflagsに-Wl,--allow-shlib-undefinedを追加します。リンクしているすべてのライブラリに影響するため、これは3より悪くなりますが、ヘッダーに干渉する必要はありません。
+0

私は#1が最も好きです。欠点は、デバイス上のファームウェアリリースで「自動的に」取得するのではなく、新しいバージョンをリリースするたびに最新のライブラリを入手する必要があることです。 –

+0

理想的には、彼らはヘッダーの横にあなたにそれを提供します。 –

+0

私の言うことは、ほとんどの場合、パブリックインターフェイスは変更されず、実装だけです。それで、私はそれをどうにかアップグレードするべきですか、あるいは何らかの形でABIの非互換性を作成し、それらをアップグレードするだけでよいのですか? –

1

Windowsでは、実際のダイナミックライブラリ(.dll)の代わりにエクスポートライブラリ(.lib)がリンカに存在する必要があります。私はあなたが似たようなものを作ることを試みることができると思う、それは偽物を作ることです。実際の.soから輸出されたすべてのメソッドのスタブを含んでおり、それに対してリンクしています。これはうまくいけばリンカを幸せにすると同時に、ランタイムアプリケーションでは実際の.soをロードします。

+0

これは、NDKがプラットフォームライブラリFWIWで行うことです。 –

関連する問題