1

clang++次のコマンドラインコマンド(行に分割)を使用して、を使用してC++プロジェクトをビルドします。

clang++
  -std=c++11
  -W -Wall -Wextra -pedantic -Wno-newline-eof -Werror
  -O4
  -I<dirs>
  -L<dirs>
  -l<libs>
  -framework <frameworks>
  -D <defs>
  -o <filename>
  <files>

ただし、を実行すると、コマンドラインにあるstrings <filename>にもかかわらず、いくつかのクラス名が表示されます。llvmにすべてのシンボルを削除するように指示する必要があるものを-O4試しましたが、これらは削除されません。-Wl,-s

表示されるクラス名には、共通点が1つあるようです。それは、vtableがあるということです。これらのクラスの1つは次のとおりです。

class MyClass {
public:
    virtual void myFunc() = 0;  
};

シンボルとして表示されます:

N9namespace7MyClassE

名前空間とクラス名が最終ファイルに表示されるのは気に入らない。これらを取り除くにはどうすればよいですか?私のバイナリはコマンドラインユーティリティなので、main関数のみをエクスポートする必要があります。


(@nmで提案されているように)提供した後でも-fno-rtti、次のようないくつかの名前が残っています。

__ZN15MyClassInstance6myFuncEv

(MyClassInstanceは上記のMyClassのサブクラスです)

さらに、グローバル変数の名前もバイナリに含まれています。

4

1 に答える 1

1

-fno-rttiとにかく使用しないC++機能であるRTTIを無効にするclang引数を指定することで、これを解決しました。

[編集]を意味しない
ようです。私のクラス名への最後のいくつかの参照は、を実行することで削除できます。-O4stripstrip

于 2013-01-28T11:27:50.960 に答える