提问人:Marco Scannadinari 提问时间:9/28/2013 最后编辑:Marco Scannadinari 更新时间:11/17/2023 访问量:65922
调用内联函数时未定义引用
undefined reference when calling inline function
问:
我从带有内联函数的 GCC 4.8.1 中收到一个非常奇怪的错误。
我在头文件 ( 和 ) 中定义了两个几乎相同的内联函数,唯一的区别是它们打印的内容 - 一个是消息的前缀,另一个是(程序名称、错误消息)。当定义内联函数并编译调试版本(因此它设置宏)时,我得到很多未定义的引用错误:debug.h
error.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
但是更改 的定义以消除错误。但是我从未从 的定义中收到任何错误,尽管它的辩护是 ,而不是 .debug()
static inline
error()
inline
static inline
定义都在标题中(即未原型化)
答:
根据手册,传递启用 C99 而不是 GNU 内联语义。-std=gnu11
这意味着 ,并且所有的行为都不同。特别是,期望在单独的翻译单元中提供外部定义(您可以在不重复定义的情况下提供该定义 - 请参阅此答案)。inline
static inline
extern inline
inline
https://en.wikipedia.org/wiki/Inline_function#C99在 C99 中,内联定义的函数永远不会发出外部可见的函数,而内联定义的 extern 函数将始终发出外部可见的函数。与 C++ 不同,没有办法要求仅在需要时才发出在翻译单元之间共享的外部可见函数。
因此,要修复此错误,只需为此函数添加 extern 内联即可
评论
static inline
extern inline
以上答案都没有给出确切的工作解决方案!
用于避免未定义或重复的定义错误。 将像在 C++ 中一样运行。static inline
static inline
inline
上一个:从另一个函数返回的函数
下一个:调用内联函数时未定义引用
评论
undefined reference
inline func();
-O0
-O
-O1
-O2
-O3