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

我从带有内联函数的GCC 4.8.1中收到一个非常奇怪的错误。

我在error()的头文件(debug()static inline)中定义了两个几乎相同的内联函数,唯一的区别是它们打印的内容-消息的前缀inline,另一个static inline(程序名,错误消息)。 在内联定义函数并编译调试版本时(因此它设置了宏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

定义全部在标头中(即未原型化)

1个解决方案
47 votes

根据手册,传递inline会启用C99而不是GNU内联语义。

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

Christoph answered 2020-07-23T07:10:55Z
translate from https://stackoverflow.com:/questions/19068705/undefined-reference-when-calling-inline-function