web-dev-qa-db-fra.com

référence non définie lors de l'appel de la fonction inline

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)

43
Marco Scannadinari

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

45
Christoph