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

Posted

技术标签:

【中文标题】调用内联函数时未定义的引用【英文标题】:undefined reference when calling inline function 【发布时间】:2013-10-04 19:26:43 【问题描述】:

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

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

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

【问题讨论】:

我发现编译器在引用inline func(); 时会导致undefined reference 带有-O0 或缺少-O 标志,并且将使用-O1-O2 成功编译, -O3. @exebook 谢谢,这解决了我的问题。此处的答案中提供了解释:***.com/questions/16245521/…. 【参考方案1】:

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

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

【讨论】:

以上是关于调用内联函数时未定义的引用的主要内容,如果未能解决你的问题,请参考以下文章

什么是内联函数

内联函数详解

游戏开发岗面经总结7(函数调用底层,值捕获和引用捕获,宏定义和内联,排序算法稳定性,static,软工思想,sprite和image的区别,细小物体碰撞问题)

游戏开发岗面经总结7(函数调用底层,值捕获和引用捕获,宏定义和内联,排序算法稳定性,static,软工思想,sprite和image的区别,细小物体碰撞问题)

内联函数的定义及说明

内联函数和宏定义