gcc/g++ と任意の委員会によって指定された C API を使用していたとします。この仕様は機能を定義します
void foo(void);
現在、この仕様に従っていくつかの実装があります。サンプルとして 2 つを選び、and と呼びましょう(libnfoonfoo
とxfoo
libxfoo によってそれぞれ静的ライブラリと動的ライブラリとして提供されます)。
foo
次に、 -API用の C++ フレームワークを作成します。したがって、抽象クラスを指定します
class Foo
{
public:
virtual void foo(void) = 0;
};
および対応する実装
#include <nfoo.h>
#include "Foo.h"
class NFoo : public Foo
{
public:
virtual void foo(void)
{
::foo(); // calling foo from the nfoo C-API
}
};
としても
#include <xfoo.h>
#include "Foo.h"
class XFoo : public Foo
{
public:
virtual void foo(void)
{
::foo(); // calling foo from the xfoo C-API
}
};
今、私たちは問題に直面しています: 1 つのライブラリにすべてを作成 (リンク) するにはどうすればよいでしょうか?
foo
C API 実装の関数シンボルとのシンボルの衝突が発生することがわかります。
すでに C++ ラッパーの実装を個別の静的ライブラリに分割しようとしましたが、静的ライブラリはリンクされていないオブジェクト ファイルの単なるコレクションであることに (再び) 気づきました。したがって、C ライブラリをラッパーに完全にリンクし、それらのシンボルを削除/非表示にする方法がない限り、これはまったく機能しません。
提案は大歓迎です。
更新:最適なソリューションは、両方の実装を同時にサポートする必要があります。
注: このコードは、機能することを意図したものではありません。疑似コードとして認識してください。