undefined reference when calling inline function

寵の児 提交于 2019-11-26 09:38:46

问题


I am getting a really odd error from GCC 4.8.1 with inline functions.

I have two near-identical inline functions defined in header files (debug.h and error.h) in src/include/, with the only difference being what they print - one prefixes DEBUG: to the message, and the other %s: error: %s (program name, error message). When defining the functions both inline, and compiling a debug build (so it sets the macro DEBUG=1), I get lots of undefined reference errors:

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

But changing debug()\'s definition to static inline removes the errors. But I have never received any errors from error()\'s definition, although its defenition is inline, and not static inline.

The definitions are all in headers (i.e. not prototyped)


回答1:


According to the manual, passing -std=gnu11 enables C99 instead of GNU inline semantics.

This means inline, static inline and extern inline all behave differently. In particular, inline expects an external definition in a separate translation unit (which you can provide without duplicating the definition - see this answer).



来源:https://stackoverflow.com/questions/19068705/undefined-reference-when-calling-inline-function

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!