我在使用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
,我从未收到过任何错误。
这些定义都在头文件中(即未进行原型声明)。
-O0
或没有使用-O
标志时,在引用inline func();
时会出现“未定义的引用(undefined reference)”错误,而在使用-O1
、-O2
、-O3
时则可以成功编译。请注意不要改变原文意思,只需让翻译更易懂。 - exebook