2013-09-28 14 views
31

Ricevo un errore davvero strano da GCC 4.8.1 con funzioni inline.riferimento non definito quando si chiama la funzione inline

Ho due funzioni quasi identiche in linea definiti nei file di intestazione (debug.h e error.h) in src/include/, con l'unica differenza è ciò che stampano - uno prefissi DEBUG: al messaggio, e l'altro %s: error: %s (nome del programma, il messaggio di errore). Nel definire le funzioni sia in linea, e la compilazione di una build di debug (così si definisce la macro DEBUG=1), ricevo un sacco di errori di riferimento non definite:

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 

Ma cambiare debug() 's definizione static inline rimuove gli errori. Ma non ho mai ricevuto errori dalla definizione di error(), sebbene la sua defenizione sia inline e non static inline.

Le definizioni sono tutti nelle intestazioni (cioè non prototipo)

risposta

34

Secondo the manual, passando -std=gnu11 consente C99 anziché GNU semantica linea.

Ciò significa che inline, static inline e extern inline si comportano in modo diverso. In particolare, inline prevede una definizione esterna in un'unità di traduzione separata (che è possibile fornire senza duplicare la definizione - vedere this answer).