2013-09-28 36 views
31

从内联函数中获得GCC 4.8.1的一个非常奇怪的错误。调用内联函数时未定义的引用

我在src/include/在头文件(debug.herror.h)所定义,与唯一的区别是2近乎相同的内联函数他们打印的内容 - 一个前缀DEBUG:到消息,另一个%s: error: %s(节目名称,错误消息)。当定义函数内联,编译和调试版本(因此它设置的宏观DEBUG=1),我得到很多未定义引用错误的:

src/main_debug.o 
    gcc -osrc/main_debug.o src/main.c -c -Wall -Wextra -Wpedantic -std=gnu11 -march=native -Og -g -DCC="\"gcc\"" -DCFLAGS="\"-Wall -Wextra -Wpedantic -std=gnu11 -march=native -Og -g\"" -DDEBUG=1 -DBTCWATCH_VERSION="\"0.0.1\"" 

src/lib/btcapi_debug.o 
    gcc -osrc/lib/btcapi_debug.o src/lib/btcapi.c -c -Wall -Wextra -Wpedantic -std=gnu11 -march=native -Og -g -DCC="\"gcc\"" -DCFLAGS="\"-Wall -Wextra -Wpedantic -std=gnu11 -march=native -Og -g\"" -DDEBUG=1 

src/lib/libbtcapi_debug.a 
    ar rc src/lib/libbtcapi_debug.a src/lib/btcapi_debug.o 
    ranlib src/lib/libbtcapi_debug.a 

src/lib/cmdlineutils_debug.o 
    gcc -o src/lib/cmdlineutils_debug.o src/lib/cmdlineutils.c -c -Wall -Wextra -Wpedantic -std=gnu11 -march=native -Og -g -DCC="\"gcc\"" -DCFLAGS="\"-Wall -Wextra -Wpedantic -std=gnu11 -march=native -Og -g\"" -DDEBUG=1 

src/lib/libcmdlineutils_debug.a 
    ar rc src/lib/libcmdlineutils_debug.a src/lib/cmdlineutils_debug.o 
    ranlib src/lib/libcmdlineutils_debug.a 

debug 
    gcc -obtcwatch-debug src/main_debug.o -Lsrc/lib/ -lbtcapi_debug -lcmdlineutils_debug -lcurl -ljansson 
src/main_debug.o: In function `main': 
/home/marcoms/btcwatch/src/main.c:148: undefined reference to `debug' 
src/main_debug.o:/home/marcoms/btcwatch/src/main.c:185: more undefined references to `debug' follow 
collect2: error: ld returned 1 exit status 
make: *** [debug] Error 1 

但改变debug()的定义static inline删除错误。但我从来没有收到任何来自error()的定义的错误,虽然其定义是inline,而不是static inline

的定义都在报头(即,不原型)

回答

34

根据the manual,传递-std=gnu11能够代替GNU直列语义C99。

这意味着inline,static inlineextern inline都表现不同。特别是,inline需要在单独的翻译单元中提供外部定义(您可以在不重复定义的情况下提供该翻译单元 - 请参阅this answer)。