undefinierte Referenz beim Aufruf der Inline-Funktion

Lesezeit: 2 Minuten

Benutzeravatar von Marco Scannadinari
Marco Scannadinari

Ich bekomme einen wirklich seltsamen Fehler von GCC 4.8.1 mit Inline-Funktionen.

Ich habe zwei nahezu identische Inline-Funktionen, die in Header-Dateien definiert sind (debug.h und error.h) in src/include/mit dem einzigen Unterschied, was sie drucken – ein Präfix DEBUG: zur Nachricht, und die andere %s: error: %s (Programmname, Fehlermeldung). Beim Definieren der Funktionen sowohl inline als auch beim Kompilieren eines Debug-Builds (damit das Makro festgelegt wird DEBUG=1), erhalte ich viele undefinierte Referenzfehler:

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

Aber wechselnd debug()‘s Definition zu static inline beseitigt die Fehler. Aber ich habe noch nie eine Fehlermeldung erhalten error()‘s Definition, obwohl seine Definition ist inlineund nicht static inline.

Die Definitionen befinden sich alle in Kopfzeilen (dh nicht als Prototyp).

  • Ich habe festgestellt, dass der Compiler dazu führen wird undefined reference beim Verweis auf die inline func(); mit -O0 oder abwesend -O Flag und wird erfolgreich mit kompiliert -O1, -O2, -O3.

    – Exebook

    27. Februar 2021 um 7:24 Uhr


  • @exebook Danke, das hat mein Problem gelöst. Eine Erklärung finden Sie in den Antworten hier: stackoverflow.com/questions/16245521/….

    – Nielsen

    5. Juli 2021 um 12:09 Uhr

Benutzeravatar von Christoph
Christoph

Entsprechend das HandbuchVorbeigehen -std=gnu11 aktiviert C99 statt GNU-Inline-Semantik.

Das heisst inline, static inline und extern inline alle verhalten sich anders. Im Speziellen, inline erwartet eine externe Definition in einer separaten Übersetzungseinheit (die Sie bereitstellen können, ohne die Definition zu duplizieren – siehe diese Antwort).

1415940cookie-checkundefinierte Referenz beim Aufruf der Inline-Funktion

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy