2013-09-28 21 views
31

Otrzymuję naprawdę dziwny błąd od GCC 4.8.1 z funkcjami inline.niezdefiniowane odwołanie podczas wywoływania funkcji inline

Mam dwie niemal identyczne funkcje inline zdefiniowane w plikach nagłówkowych (debug.h i error.h) w src/include/, z tą tylko różnicą, czego print - jeden prefiksy DEBUG: do wiadomości, a drugi %s: error: %s (nazwa programu, wiadomość o błędzie). Przy definiowaniu funkcji zarówno inline i kompilacji build debugowania (tak to ustawia makro DEBUG=1), dostaję mnóstwo błędów niezdefiniowane odniesienia:

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 

Ale zmieniając debug() „s definicję static inline usuwa błędy. Ale nigdy nie otrzymałem żadnych błędów z definicji error(), chociaż jej defenicja to inline, a nie static inline.

Definicje są w nagłówku (czyli nie prototyp)

Odpowiedz

34

Według the manual, przechodząc -std=gnu11 umożliwia C99 zamiast gnu semantyki inline.

Oznacza to, że wszystkie zachowania zachowują się inaczej. W szczególności, inline oczekuje zewnętrznej definicji w oddzielnej jednostce tłumaczeniowej (którą możesz podać bez powielania definicji - patrz this answer).

Powiązane problemy