2013-09-28 18 views
31

インライン関数を使用してGCC 4.8.1から本当に奇妙なエラーが発生しています。インライン関数を呼び出すときの未定義参照

Iの唯一の違いは、それらが印刷ものであると、src/include/のヘッダファイル(debug.herror.h)で定義された2つの周辺の同一のインライン機能を有する - メッセージ、および他の%s: error: %s(プログラム名、エラー・メッセージに1つのプレフィックスDEBUG:を)。 (それはマクロDEBUG=1を設定する)の両方の機能インラインの定義、およびデバッグビルドをコンパイルすると、私は未定義の参照エラーの多くを得る:static inline

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 

しかしdebug()さんの変更の定義は、エラーを除去します。しかし、私はerror()の定義から何のエラーも受けたことはありませんが、その飾りはinlineであり、static inlineではありません。

定義は-std=gnu11代わりにGNUインラインセマンティクスのC99を可能に渡し、(すなわちプロトタイプではない)ヘッダ内のすべてthe manualによれば

答えて

34

あります。

つまり、inline,およびextern inlineはすべて異なる動作をします。特に、inlineは、別の翻訳単位で外部定義が必要です(定義を複製することなく提供できます - this answerを参照)。

関連する問題