2013-04-30 28 views
5

我想從我的C++ xcode應用程序中的幾個靜態庫(我自己的庫)的所有未引用符號中鏈接。我已經嘗試了所有與'strip'相關的屬性(通過搜索'strip'屬性),但未引用的符號,特別是類沒有鏈接到。如何在xcode中禁用C++死代碼剝離

我也嘗試了-r鏈接器標誌,但 :然後連接器只與抱怨「LD:-r和-dead_strip不能一起使用」

我已經嘗試添加「-no_dead_strip」的連接標誌,但隨後的連接只是告訴我 「-no_dead_strip」被忽略。

我用'Apple LLVM'和'LLVM GCC'得到了同樣的結果。

所以,我的問題是:我應該使用什麼鏈接器標誌或目標屬性來關閉所有死代碼剝離並強制未鏈接的類進行鏈接?

+0

也許試試'--whole-archive'鏈接器標誌? – 2013-04-30 07:59:33

+0

Android的NDK在其「原生粘合」(靜態庫)中包含一個名爲'app_dummy()'的空函數,該函數沒有實現。從客戶端調用(與提到的庫鏈接)顯然會防止在該編譯單元中刪除符號。我正在尋找更優雅的方法,但似乎沒有。 – pauluss86 2014-01-29 21:52:02

回答

6

標準鏈接機制 - 即使用-l選項來鏈接.a文件將智能地過濾掉未使用的目標文件,所以符號在結果二進制文件中不存在的原因是它們實際上並不是如果你想從一個檔案得到所有的符號

鏈接,您可以使用標誌:-force_load libraryarchive,使用這樣的:-Wl,-force_load,libfoobar.a其中libfoobar.a是你想從所有符號存檔。如果你從gcc/clang-Wl,-all_load駕駛它-all_load,或:

爲了獲得來自所有歸檔所有的符號,你應該使用鏈接標誌。

雖然它會產生醜陋的符號表!

+1

'死代碼剝離'==否和'不死帶條件和條款'==是,它沒有工作。但是當我添加'-all_load'鏈接器標誌時,一切都很完美。謝謝!! – 2013-04-30 08:52:26