63

インライン関数で GCC 4.8.1 から非常に奇妙なエラーが発生します。

debug.hのヘッダー ファイル (およびerror.h) で定義された 2 つのほぼ同一のインライン関数がありますsrc/include/。唯一の違いは、出力されるものです。1 つDEBUG:はメッセージのプレフィックス、もう 1 つは%s: error: %s(プログラム名、エラー メッセージ)。関数をインラインで定義し、デバッグ ビルドをコンパイルすると (つまり、マクロが設定されますDEBUG=1)、多くの未定義の参照エラーが発生します。

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()の定義を に変更static inlineすると、エラーが解消されます。error()しかし、定義は であり、 ではありませんが、の定義からエラーを受け取ったことはinlineありませんstatic inline

定義はすべてヘッダーにあります (つまり、プロトタイプ化されていません)。

4

1 に答える 1

69

マニュアルによると、渡す-std=gnu11と、GNU インライン セマンティクスの代わりに C99 が有効になります。

これは を意味inlineし、すべて異なる動作static inlineをします。extern inline特に、inline別の翻訳単位で外部定義が必要です (定義を複製せずに提供できます -この回答を参照してください)。

于 2013-09-28T16:29:32.553 に答える