调用内联函数时未定义的引用

时间:2013-09-28 15:47:22

标签: c function undefined inline header-files

我从GCC 4.8.1获得了一个非常奇怪的错误,内联函数。

我在debug.h中的头文件(error.hsrc/include/)中定义了两个几乎相同的内联函数,唯一的区别是它们打印的内容 - 一个前缀{{1}消息,另一个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

这些定义都在标题中(即非原型)

1 个答案:

答案 0 :(得分:44)

根据the manual,传递-std=gnu11启用C99而不是GNU内联语义。

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