Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

undefined reference when calling inline function

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)

like image 748
Marco Scannadinari Avatar asked Sep 28 '13 15:09

Marco Scannadinari


People also ask

Does GCC ignore inline?

GCC does not inline any functions when not optimizing unless you specify the ' always_inline ' attribute for the function, like this: /* Prototype.

What is inline function calls?

An inline function is one for which the compiler copies the code from the function definition directly into the code of the calling function rather than creating a separate set of instructions in memory. This eliminates call-linkage overhead and can expose significant optimization opportunities.

Is inline deprecated?

warning. The inline modifier for inline classes is deprecated.

Can compiler ignore inline function?

Remember, inlining is only a request to the compiler, not a command. Compiler can ignore the request for inlining. Compiler may not perform inlining in such circumstances like: If a function contains a loop.


1 Answers

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).

like image 51
Christoph Avatar answered Sep 24 '22 00:09

Christoph