c - 调用内联函数时 undefined reference

标签 c function undefined inline header-files

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

我在 src/include/ 的头文件(debug.herror.h)中定义了两个几乎相同的内联函数,唯一的区别是它们打印的内容 - 一个前缀 DEBUG: 到消息,另一个 %s: error: %s (程序名称,错误消息)。在定义内联函数和编译调试版本时(因此它设置了宏 DEBUG=1),我遇到很多 undefined reference 错误:

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

定义都在标题中(即没有原型(prototype))

最佳答案

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

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

关于c - 调用内联函数时 undefined reference ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19068705/

相关文章:

c - 在 C 中初始化二维字符数组

Antlr C 解析器能否从无效 token 中恢复

c++ - 在函数中调用结构的构造函数,C++

function - 关于偶数和奇数的 Haskell 函数

javascript - 返回时函数变为未定义

c - 需要知道 fork 是如何工作的吗?

C语言前缀后缀问题

php - 标准正态累积分布函数

c++ - 使用 libcurl 的项目中 undefined reference

索引空变量时未引发 php 未定义索引通知