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

undefined reference when calling inline function

提问人:Marco Scannadinari 提问时间:9/28/2013 最后编辑:Marco Scannadinari 更新时间:11/17/2023 访问量:65922

问:

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

我在头文件 ( 和 ) 中定义了两个几乎相同的内联函数,唯一的区别是它们打印的内容 - 一个是消息的前缀,另一个是(程序名称、错误消息)。当定义内联函数并编译调试版本(因此它设置宏)时,我得到很多未定义的引用错误:debug.herror.hsrc/include/DEBUG:%s: error: %sDEBUG=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 inlineerror()inlinestatic inline

定义都在标题中(即未原型化)

C 函数 未定义的 内联 头文件

评论

6赞 exebook 2/27/2021
我发现编译器将导致引用 with 或 absent 标志,并将使用 , , 成功编译。undefined referenceinline func();-O0-O-O1-O2-O3
1赞 nielsen 7/5/2021
@exebook 谢谢,这解决了我的问题。此处的答案中提供了解释:stackoverflow.com/questions/16245521/...

答:

74赞 Christoph 9/29/2013 #1

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

这意味着 ,并且所有的行为都不同。特别是,期望在单独的翻译单元中提供外部定义(您可以在不重复定义的情况下提供该定义 - 请参阅此答案)。inlinestatic inlineextern inlineinline

1赞 Recep Bashir 5/14/2023 #2

https://en.wikipedia.org/wiki/Inline_function#C99在 C99 中,内联定义的函数永远不会发出外部可见的函数,而内联定义的 extern 函数将始终发出外部可见的函数。与 C++ 不同,没有办法要求仅在需要时才发出在翻译单元之间共享的外部可见函数。

因此,要修复此错误,只需为此函数添加 extern 内联即可

评论

1赞 midenok 11/17/2023
不,最好添加以追求 C++ 行为。 如果包含来自多个源的标头,将生成重复错误。static inlineextern inline
1赞 midenok 11/17/2023 #3

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

用于避免未定义或重复的定义错误。 将像在 C++ 中一样运行。static inlinestatic inlineinline