2012-08-05 75 views
1

我正在閱讀一本C++書,其中指出鏈接器通常會傳遞重疊名稱而不是原始名稱。所以,我正在試圖看看會出現什麼樣的重疊名稱。因此,我創建了一個名爲Test的類,它只包含函數簽名並將其保存到名爲name_mangling.cpp的文件中。打印C++名字mangling

然後在主方法中,我調用這些函數。我首先編譯該文件以.O然後試圖與命令如

g++ -o name_mangling name_mangling.o 

我希望看到錯位的名稱鏈接,但克++印刷實際名稱如

undefined reference to `Test::Test(char const*)' 

但在另當我嘗試鏈接到諸如.so這樣的共享對象時,我看到了一些手工編制的名稱。爲什麼g ++在.so的情況下打印損壞的名稱,而不是上述情況?

+6

如果你只是想看看這些被破壞的名字,只要說'nm name_mangling.o',它應該在對象文件中列出符號。 – 2012-08-05 17:51:19

+0

非常好,謝謝。 – Jimm 2012-08-05 17:54:53

回答

3

它不會顯示重名的名稱,因爲它知道用代碼編寫的實際/真實名稱。顯示錯位的名字將會適得其反,因爲你可能只是拼錯了一些名字(而且名字更難處理)。

如上所述,在Linux/GCC下有「nm」工具可以打印重名的名稱。在Windows下,您可以嘗試Dependency Walker,它曾經是Visual C++示例的一部分,並且對於確保啓動時需要所有動態鏈接庫也非常有用。