7

私はOpenCVを使用していますが、ライブラリ全体を独自の名前空間内に配置したいと思います。私はかなり周りを見回しましたが、答えが見つかりませんでした...

ライブラリのソースコードを変更せずにこれを行うことはできますか?それならどうやって?

4

4 に答える 4

7

基本的にいいえ。ラッパーとマクロを作成することでそれを試みることもできますが、うまくいく可能性は低いでしょう。本当にこれを行う必要がある場合は、ライブラリをフォークして、必要な名前空間を追加することをお勧めします。もちろん、このアプローチを取るには本当にそれを行う必要がありますが、そうではないのではないかと思います。

于 2009-07-13T18:01:42.960 に答える
4

原則として、ライブラリのシンボル エクスポート テーブルを解析し、そこでシンボルの名前を変更するプログラムを作成できます。もちろん、ヘッダーを変更する必要があります。

つまり、単純なスクリプトを記述して名前空間タグを追加し、ライブラリを再コンパイルする方がはるかに簡単です。

于 2009-07-13T18:01:03.540 に答える
4

一般的な答えは、できないということですが、できるいくつかのトリックがあります。

たとえば、binutilsobjcopyにはオブジェクトをコピーする機能がありますが、--prefix-symbolsフラグを使用してすべてのシンボルにプレフィックスを付けます。物事にプレフィックスを付けることは、多くの場合、貧弱な名前空間であり、競合を回避するための「OK」な方法です。

使い方はとても簡単で、次のようになります。

objcopy --prefix-symbols "__mylib_" object.o new_object.o

注:はい、.so ファイルでも動作します。

注 2:これにより、C++ の名前マングリングが完全に中断されるため、C スタイル API を使用するライブラリでのみこれを試みてください。何もない名前空間を追加することについて話しているので、これが当てはまると思います。

于 2009-07-13T19:53:26.793 に答える
2

名前空間内で同じインターフェイスを宣言するラッパー ヘッダー ファイルを提供できます。ラッパー ソース ファイルに、ライブラリのヘッダーを含め、そのライブラリを呼び出します。ソース以外のソースは、ライブラリのシンボルについて知る必要はありません。本当に注意したい場合は、動的にロードされたライブラリ内にすべてを配置できます。

一部のライブラリのリンカの依存関係を隠すために、COM でこれを行うことは非常に一般的でした。C++ でできない理由がわかりません。

于 2009-07-13T18:50:30.553 に答える