GCCの可視性属性拡張が必要です。
実際には、次のようなものです。
#define MODULE_VISIBILITY __attribute__ ((visibility ("hidden")))
#define PUBLIC_VISIBILITY __attribute__ ((visibility ("default")))
(おそらく#ifdef
、いくつかの構成トリックautoconf
や他のautotoolsを使用して、上記のマクロが必要です。他のシステムでは、などのような空の定義があります#define PUBLIC_VISIBILITY /*empty*/
...)
次に、変数を宣言します。
int module_var MODULE_VISIBILITY;
または関数
void module_function (int) MODULE_VISIBILITY;
その後、共有ライブラリの内部で使用module_var
または呼び出すことができますが、外部では使用できません。module_function
GCCの-fvisibilityコード生成オプションも参照してください。
ところで、ライブラリ全体をコンパイルして通常どおり-Dsomeglobal=alongname3419a6
に使用することもできます。someglobal
実際にそれを見つけるには、ユーザーが同じプリプロセッサ定義をコンパイラに渡す必要があります。名前をalongname3419a6
ランダムでありそうにないものにして、衝突を起こりにくくすることができます。
PS。この可視性は、GCC(およびおそらくLinux上のELF共有ライブラリ)に固有です。GCCなしでは、または共有ライブラリの外部では機能しません。Linux固有です(GCCを備えたSolarisなど、他のいくつかのシステムに搭載されている場合でも)。おそらく、他のいくつかのコンパイラ(LLVMclang
から)は、共有ライブラリ(静的ライブラリではない)のLinuxでもサポートしている可能性があります。実際、(単一の共有ライブラリの複数のコンパイルユニットに対する)実際の非表示は、ほとんどがリンカーによって実行されます(ELF共有ライブラリで許可されているため)。