1

ライブラリ(GCC 4.4.4-14 ubuntu 5.1)でacインターフェースをコンパイルしています。これは基本的に次のようになります

ヘッダ

extern "C" 
{
  int foo()
}

実装

int foo()
{}

int bar() __attribute__((alias ("foo")));

これは正常にコンパイルされますが、共有オブジェクトをテスト アプリケーションにリンクし、bar() を呼び出してみると、関数が認識されません。

エイリアス行を実装からヘッダーに移動しようとしたところ、コンパイラ エラーが発生しました。

bar() aliased to undefined symbol foo

エイリアスをヘッダーに移動すると、このエラーが発生するのはなぜですか? どうすればそれをすべて機能させることができますか?

4

2 に答える 2

2

上記のbooiljoungの回答とは別に、gccサイトからの以下の情報も役立つ場合があります。

alias ("target") alias 属性により、指定する必要がある別のシンボルのエイリアスとして宣言が発行されます。たとえば、 void f () { /* 何かを行います。*/; } void f () _ attribute ((weak, alias (" _f")));

f' to be a weak alias for_f 'を定義します。C++ では、ターゲットの修飾名を使用する必要があります。` _f' が同じ翻訳単位で定義されていないとエラーになります。

すべてのターゲット マシンがこの属性をサポートしているわけではありません。

于 2012-05-29T16:15:24.747 に答える
1

実装には extern "C" が必要です。

extern "C" 
{
  int foo();
}


extern "C" // <<< extern "C" also!!!
{
  int foo()
  {}
}

int bar() __attribute__((alias ("foo")));
于 2012-05-29T15:43:47.327 に答える