为什么在编译时没有捕获“符号查找错误”?

时间:2013-03-13 11:28:37

标签: c gcc

我正在更新一些旧代码,并且意外地将一个宏放在不再定义的内部:

// "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 个答案:

答案 0 :(得分:4)

您的分析是正确的:DETAIL被视为隐式定义的函数。

来自gcc manual

  

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

     

在声明之前使用函数时发出警告。在C99模式(-std=c99-std=gnu99)中,默认情况下会启用此警告,并由-pedantic-errors生成错误。 -Wall也启用了此警告。

另外,正如@Jonathan Leffler在评论中指出的那样:

  

此外,在某些版本的GCC中,-Werror=implicit-function-declaration是一个错误(对于任何其他显式警告选项也是如此)。可以使用-Werror将所有警告转换为错误。