2013-09-28 17 views
31

Satır içi işlevleri olan GCC 4.8.1'den gerçekten garip bir hata alıyorum.tanımsız başvuru

Onların yazdırmak Ne tek fark olmak üzere src/include/ başlık dosyaları (debug.h ve error.h) tanımlanan iki yakın özdeş satır içi işlevlere sahiptir - iletiye bir önekleri DEBUG: ve diğer %s: error: %s (program adı, hata mesajı). Her iki satır içi işlevleri tanımlayan ve hata ayıklama yapı derleme (yani makro DEBUG=1 setleri), ben tanımsız başvuru hataları çok olsun:

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 

Ama static inline için debug() 'ın tanımını değiştirerek hatalarını ortadan kaldırır. Ancak,tanımından herhangi bir hata almadım; ancak, devalı inline ve static inline değil.

tanımlar -std=gnu11 yerine GNU içi anlambilim C99 sağlar geçen (yani örneklenmekte olan) başlıkları tüm the manual göre

cevap

34

bulunmaktadır.

Bu, inline, static inline ve extern inline tümünün farklı davrandığı anlamına gelir. Özellikle, inline, ayrı bir çeviri biriminde (tanımı çoğaltmadan sağlayabileceğiniz bir dış tanım) bekler - bkz. this answer).