2011-01-22 32 views
22

我正在使用可以構建爲共享庫或靜態庫的C++庫。 該庫使用工廠技術,當程序啓動時靜態對象註冊自己並創建靜態對象。如何強制gcc鏈接來自庫的未引用的靜態C++對象

只要使用共享庫,此工作正常。當使用靜態版本時,沒有一個靜態對象被包含到最終的程序中(因爲它們沒有直接引用),因此它們的功能不可用。

有沒有辦法強制gcc在鏈接時包含庫中的所有靜態對象?

該庫是開源的,我可以修改它,如果有幫助。

回答

22

您可以使用-Wl,--whole-archive -lyourlib,有關更多信息,請參閱ld的聯機幫助頁。

在命令行上-Wl, - whole-archive之後提到的任何靜態庫都會完全包含在內,如果需要,您可以再次關閉此功能。 -Wl,--whole-archive -lyourlib -Wl,--no-whole-archive -lotherlib

+5

-Wl, - 整個歸檔會導致大量的符號被包含在其他庫中,或者一些無法解析的符號。包含靜態數據是否有更精細的方式? – 2011-01-22 13:15:24

+0

這沒有意義基因:它與加載共享庫相同:你得到整個庫,沒有別的。誠然,ld有一個找到外部引用的概念,所以你需要得到正確的東西的順序。 – Yttrill 2011-01-22 13:40:39

1

一種黑客幫了我。儘管如此,仍然必須包含標題。

// in the header with your class 
struct RegistrationHelper { 
    RegistrationHelper(); 
}; 

static RegistrationHelper Helper; 

// in your cpp where you register your class 
RegistrationHelper::RegistrationHelper() {}