4

私はクラスAを持っています:

class A
{
public:
   A() {}
   virtual ~A() {}

   void Func();
};

Aを使用する別のクラスM。すべてのAのシンボルを非表示にするlibM.soを作成したいと思います。次のスクリプトを使用してコンパイルします。

g++ -c A.cc -fPIC -fvisibility=hidden
g++ -c M.cc -fPIC
g++ -shared -z defs -o libM.so M.o A.o

しかし、「nm -DC libM.so」を使用すると、まだ

0000000000000c78 W A::A()
0000000000000c78 W A::A()

Googleでこの質問を検索し、別のgccオプションを見つけました:「-fvisibility-inlines-hidden」を非表示のインライン関数に追加しましたが、Aoをコンパイルするときにこのオプションを追加しても同じ結果が得られました

g++ -c A.cc -fPIC -fvisibility=hidden -fvisibility-inlines-hidden

「-fvisibility-inlines-hidden」が効果がないのはなぜですか? A::A() が libM.so のエクスポート シンボルに表示されないようにするにはどうすればよいですか? どうもありがとうございました!

4

1 に答える 1

1

マイク・シーモアに感謝します。M.cc をコンパイルするときに -fvisibility-inlines-hidden を追加する必要があります

g++ -c A.cc -fPIC -fvisibility=hidden -fvisibility-inlines-hidden
g++ -c M.cc -fPIC -fvisibility-inlines-hidden
g++ -shared -z defs -o libM.so M.o A.o
于 2013-01-31T04:40:59.043 に答える