2013-03-13 28 views
2

我更新一些舊代碼,不小心留下一個宏中已不存在定義:爲什麼在編譯時沒有捕獲到「符號查找錯誤」?

// "DETAIL" is not defined anywhere 
if (DETAIL ("notebook")) { 
    // ... 
} 

的代碼仍然編譯和鏈接(其一個.so庫),但加載時,我得到:

gtk3-widget-factory: symbol lookup error: /usr/lib/gtk-3.0/3.0.0/ 
theming-engines/libmurrine.so: undefined symbol: DETAIL 

爲什麼不在編譯時捕獲?我想C看到DETAIL沒有任何定義,並認爲它是一個函數int -> int,對吧?有沒有辦法讓編譯器(gcc)在編譯時更加嚴格和抱怨?我不認爲我直接在我的源文件或頭文件中使用沒有定義的任何符號。

+1

您將無法使用代碼編譯可執行文件(鏈接程序會失敗),但是在庫中帶有未定義函數的代碼仍然會鏈接。 – teppic 2013-03-13 11:39:04

回答

4

您的分析是正確的:DETAIL被視爲隱式定義的函數。

gcc manual

-Wimplicit-function-declaration (C and Objective-C only)

給每當函數聲明前被使用警告。在C99模式(-std=c99-std=gnu99)中,此警告默認爲啓用,並且在-pedantic-errors之間出現錯誤。此警告也由-Wall啓用。

此外,作爲@Jonathan萊弗勒指出,在意見:

此外,在海灣合作委員會的一些版本,它與-Werror=implicit-function-declaration一個錯誤(以及類似的其他任何明確的警告選項)。所有警告都可以通過-Werror轉換爲錯誤。

+1

另外,在某些版本的GCC中,這是'-Werror = implicit-function-declaration'的錯誤(對於任何其他顯式警告選項也是如此)。所有的警告都可以通過'-Werror'轉換爲錯誤。 – 2013-03-13 11:34:51

+0

@JonathanLeffler:很好的評論,謝謝。我冒昧把它納入答案。 – NPE 2013-03-13 11:36:35