Mac系統10.6,如果我有一個文件 「unwanted.c」,其中包含:如何真正在MacOS上
class secret_thing {
public:
secret_thing() {}
void revealing_method_name() {}
};
main()
{
secret_thing obj;
obj.revealing_method_name();
}
現在我做:
$ g++ unwanted.c -o unwanted
$ strip unwanted
$ nm unwanted | grep secret
0000000100000eb8 T __ZN12secret_thing21revealing_method_nameEv
0000000100000eae T __ZN12secret_thingC1Ev
如果我打出了接口和實現祕密類,正如大多數人在編寫C++代碼時所做的那樣,在剝離的可執行文件中沒有不需要的符號。不幸的是,我遞交了一個有數千行代碼的現有代碼庫,這不是我的選擇之一。
我試過-fno-rtti,作爲一個猜測,並沒有解決任何問題。我曾向Google的衆神禱告,並發現許多脫衣俱樂部的參考資料,但沒有有用的鏈接。我已經瀏覽了mac上的strip,g ++和ld的手冊頁,並且沒有明顯的嘗試,儘管「私人外部」這個短語很有趣,但我無法弄清楚該怎麼做。
[更新] 不幸的是,我發現一個小例子的嘗試是一個問題。這是一個更復雜的例子,它更接近真正的問題,如果它被優化,它仍然有不需要的符號。
對於不好的例子,我表示歉意。事實證明很難找到最小的實際問題。非常感謝答案,但每個答案都讓我接近解決方案。
class base {
public:
virtual int revealing_method_name() = 0;
virtual ~base() {};
};
class secret_thing : public base {
public:
int revealing_method_name() { return 0; };
};
class other_thing : public base {
public:
int revealing_method_name() { return 1; };
};
int main(int argc, char**)
{
base *object = 0;
if(argc > 1) object = new secret_thing;
else object = new other_thing;
return object->revealing_method_name();
}
我發錯了代碼。帶正確的示例代碼,正如現在問題所讀的問題,通過INSIDE類定義中的方法實現,strip表示: strip:無法在/ Users/michael中刪除的間接符號表項引用的符號。玩具/不想要的 __ZN12secret_thing21revealing_method_nameEv __ZN12secret_thingC1Ev – mtoy 2009-12-19 02:04:51
但是,答案非常有用,因爲它給了我更多谷歌飼料,錯誤字符串確實揭示了一些更有趣的調查領域。 – mtoy 2009-12-19 02:11:14