2010-12-17 10 views
4

私は "C"コードでいくつかの機能を持っています。 .soをコンパイルすると、結果の.soファイルにすべての名前が表示されます。どのようにして(コード内またはmakeファイル内に)いくつかの関数だけをエクスポートするように指定することができます。Cコードをコンパイルするときに.soライブラリからどの関数をエクスポートするかを指定するにはどうすればよいですか?

+0

これは、.defファイルを使用することができると思います。 – ruslik

+0

@ruslikはウィンドウです – alternative

答えて

7

Cでは、関数がファイル内に(技術的には「コンパイル単位」)残っていて、それを「静的」と宣言したい場合に使用します。あなたが.soファイルに言及しているので、例えば

static int privateAddOne(int x) { return x + 1; } 
+2

コンパイルユニットにはプライベートで、ライブラリにはプライベートなものはほとんどありません。ほとんどの重要でないライブラリには多くのソースファイルがあります。 –

17

、それはあなたがgccまたはGCC-似コンパイラを使用している合理的な仮定のように思えます。

デフォルトでは、すべての関数がリンクオブジェクトに表示されます。externexternそれらを維持しながら、彼らは同じライブラリ内の他のソースファイルから使用することを可能にする、)あなたはhidden属性を使用して、ケースバイケースで機能(およびグローバル変数)を非表示にすることができます:

int __attribute__((visibility("hidden"))) foo(void) 
{ 
    return 10; 
} 

あるいは、コンパイル時にオプションをgccに渡すことによって、デフォルトをhiddenに変更することができます。

__attribute__((visibility("default"))) 
+1

+1正直なところ、これは受け入れられたものよりも優れた答えです(より強力です)。もちろん、あなたは2つの組み合わせを使用する必要があります! – alternative

+0

+1別のオプションを追加するには、ldリンカーとバージョンスクリプトの組み合わせを使用して、ソースコードに触れずに同様の結果を得ることができます。 – vanza

+0

この回答は正しいですが、絶対に使用しないでください。名前空間を汚染したり、呼び出し元のプログラムを破ったりすることを避けるために、可視性でシンボルを隠すことに依存するコードは、本質的に移植性がありません。ライブラリ自体の外部で使用されるべきではない外部関数が必要な場合は、ライブラリ名にいくつかのライブラリ固有のジャンクを付けてください(先頭にアンダースコアは付けません)。 –

関連する問題