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

Mar*_*ari 46 c inline function undefined header-files

我从GCC 4.8.1得到一个非常奇怪的错误,内联函数.

我在头文件(debug.herror.h)中定义了两个几乎相同的内联函数src/include/,唯一的区别是它们打印的内容 - 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
Run Code Online (Sandbox Code Playgroud)

但改变debug()定义以static inline消除错误.但我从来没有从error()定义中得到任何错误,尽管它的定义是inline,而不是static inline.

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

Chr*_*oph 47

根据手册,传递-std=gnu11启用C99而不是GNU内联语义.

这意味着inline,static inlineextern inline所有的行为不同.特别是,inline需要在单独的翻译单元中进行外部定义(您可以在不重复定义的情况下提供外部定义 - 请参阅此答案).


mid*_*nok 5

上述答案都没有给出确切的工作解决方案

用于static inline避免未定义或重复定义错误。static inline将会像inlineC++ 中一样运行。