Je reçois une erreur vraiment étrange de GCC 4.8.1 avec des fonctions en ligne.
J'ai deux fonctions en ligne presque identiques définies dans des fichiers d'en-tête (debug.h
Et error.h
) Dans src/include/
, Avec la seule différence étant ce qu'ils impriment - un préfixe DEBUG:
au message et à l'autre %s: error: %s
(nom du programme, message d'erreur). Lors de la définition des fonctions à la fois en ligne et de la compilation d'une version de débogage (il définit donc la macro DEBUG=1
), J'obtiens de nombreuses erreurs de référence non définies:
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
Mais changer la définition de debug()
en static inline
Supprime les erreurs. Mais je n'ai jamais reçu d'erreurs de la définition de error()
, bien que sa définition soit inline
, et non static inline
.
Les définitions sont toutes dans les en-têtes (c'est-à-dire non prototypées)
Selon le manuel , en passant -std=gnu11
active C99 au lieu de GNU sémantique en ligne.
Cela signifie inline
, static inline
et extern inline
se comportent tous différemment. En particulier, inline
attend une définition externe dans une unité de traduction distincte (que vous pouvez fournir sans dupliquer la définition - voir cette réponse ).