2010-11-15 110 views
8

我將我項目中的一些代碼拆分爲一個單獨的庫,以便在其他應用程序中重用。這個新的庫有不同的功能定義但不是實施,我目前的項目和其他應用程序將實現他們自己的版本的這些功能。如何強制GCC編譯未使用的函數?

我在我的原始項目中實現了這些功能,但是它們並沒有在其中的任何地方被調用。他們只被這個新的圖書館調用。結果,編譯器優化了它們,並且我發現鏈接失敗。當我向這些函數添加虛擬調用時,鏈接失敗消失。

有什麼辦法可以告訴GCC編譯這些函數,即使它們沒有被調用?

我在SuSE linux(x86-64_linux_2.6.5_ImageSLES9SP3-3)上用gcc 4.2.2編譯使用-O2

+0

您是否嘗試過使用-O0? – 2010-11-15 07:45:20

+0

@jcomeau:但是如果你想讓它們優化呢? – Cascabel 2010-11-15 07:49:34

+0

如果它沒有優化工作,那麼要做的事情是找出哪些特定的優化關閉;可能-fno-inline-small-functions會是一個,但我從來沒有深入探討過gcc如何做它的魔法 – 2010-11-15 07:54:09

回答

2

作爲一個實用主義者,我只想把:

// Hopefully not a name collision :-) 
void *xyzzy_plugh_zorkmid_3141592653589_2718281828459[] = { 
    &functionToForceIn, 
    &anotherFunction 
}; 

在源文件中的一個(或甚至一個全新的源文件,沿forcedCompiledFunctions.c東西線的文件級別,這樣很明顯它是什麼)。 。

因爲這是非靜態的,編譯器將不能夠採取一個機會,你會不會需要它在其他地方,所以應該編譯它

2

你的問題缺少一些細節,但我給它一個鏡頭...

GCC一般在除去極少數情況下的功能:

  • 如果他們d eclared靜態
  • 在某些情況下(使用-fno - 實施 - 內聯時等),如果他們聯聲明
  • 任何其他人,我錯過

我建議使用「納米」看什麼符號實際出口在生成的.o文件中驗證這實際上是問題,然後查看有關任何雜散的「靜態」關鍵字。在這個順序也不一定......

編輯:

BTW,與-Wall或-Wunused功能選項GCC將警告有關未使用函數,那麼這將是首要目標去除優化時。當心

警告:「XXX」定義,但在你的編譯日誌中不使用

+1

「我錯過的任何其他人」 - pax snorts with laughter :-) – paxdiablo 2010-11-15 08:01:58