私はOpenCVを使用していますが、ライブラリ全体を独自の名前空間内に配置したいと思います。私はかなり周りを見回しましたが、答えが見つかりませんでした...
ライブラリのソースコードを変更せずにこれを行うことはできますか?それならどうやって?
私はOpenCVを使用していますが、ライブラリ全体を独自の名前空間内に配置したいと思います。私はかなり周りを見回しましたが、答えが見つかりませんでした...
ライブラリのソースコードを変更せずにこれを行うことはできますか?それならどうやって?
基本的にいいえ。ラッパーとマクロを作成することでそれを試みることもできますが、うまくいく可能性は低いでしょう。本当にこれを行う必要がある場合は、ライブラリをフォークして、必要な名前空間を追加することをお勧めします。もちろん、このアプローチを取るには本当にそれを行う必要がありますが、そうではないのではないかと思います。
原則として、ライブラリのシンボル エクスポート テーブルを解析し、そこでシンボルの名前を変更するプログラムを作成できます。もちろん、ヘッダーを変更する必要があります。
つまり、単純なスクリプトを記述して名前空間タグを追加し、ライブラリを再コンパイルする方がはるかに簡単です。
一般的な答えは、できないということですが、できるいくつかのトリックがあります。
たとえば、binutilsのobjcopyにはオブジェクトをコピーする機能がありますが、--prefix-symbolsフラグを使用してすべてのシンボルにプレフィックスを付けます。物事にプレフィックスを付けることは、多くの場合、貧弱な名前空間であり、競合を回避するための「OK」な方法です。
使い方はとても簡単で、次のようになります。
objcopy --prefix-symbols "__mylib_" object.o new_object.o
注:はい、.so ファイルでも動作します。
注 2:これにより、C++ の名前マングリングが完全に中断されるため、C スタイル API を使用するライブラリでのみこれを試みてください。何もない名前空間を追加することについて話しているので、これが当てはまると思います。
名前空間内で同じインターフェイスを宣言するラッパー ヘッダー ファイルを提供できます。ラッパー ソース ファイルに、ライブラリのヘッダーを含め、そのライブラリを呼び出します。ソース以外のソースは、ライブラリのシンボルについて知る必要はありません。本当に注意したい場合は、動的にロードされたライブラリ内にすべてを配置できます。
一部のライブラリのリンカの依存関係を隠すために、COM でこれを行うことは非常に一般的でした。C++ でできない理由がわかりません。