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 inline
und 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 dieinline 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