-1

重複の可能性:
複数の cpps に同じヘッダーを含めることによる複数の定義エラーの繰り返し

サードパーティの src をコンパイルすると、次のエラーが発生します。

.libs/lib_udf_la-udf.o:(.rodata+0x240): multiple definition of `SHIFT_TABLE'
.libs/lib_udf_la-hll.o:(.rodata+0x0): first defined here

プロジェクトはautotoolsでセットアップされています。私のMakefile.ag参照は次のとおりです。

SOURCES = hll.c udf.c udf.h 
  • hll.c は hll.h を参照します
  • udf.c は hll.h を参照します
  • hll.h には次のconstようなものがあります。
  • hll.h には、#ifndef HLL_H ... #endif二重定義を回避する機能があります

    int const SHIFT_TABLE[1024] = {...}

なぜ複数の定義にぶつかっているのか理解できません。おそらくリンクのステップに関係していると思いますが、C に手を出してから長い時間が経ちました。

参照用の cc/link 出力は次のとおりです。

make[1]: Entering directory `/home/mping/workspace/monetdb/MonetDB-11.13.5/sql/backends/monet5/UDF'
/bin/bash ../../../../libtool --tag=CC --mode=compile gcc -DHAVE_CONFIG_H -I. -I../../../..  -I. -I.. -I./.. -I../../../include -I./../../../include -I../../../common -I./../../../common -I../../../storage -I./../../../storage -I../../../server -I./../../../server -I../../../../monetdb5/modules/atoms -I./../../../../monetdb5/modules/atoms -I../../../../monetdb5/modules/kernel -I./../../../../monetdb5/modules/kernel -I../../../../monetdb5/mal -I./../../../../monetdb5/mal -I../../../../monetdb5/modules/mal -I./../../../../monetdb5/modules/mal -I../../../../monetdb5/optimizer -I./../../../../monetdb5/optimizer -I../../../../clients/mapilib -I./../../../../clients/mapilib -I../../../../common/options -I./../../../../common/options -I../../../../common/stream -I./../../../../common/stream -I../../../../gdk -I./../../../../gdk  -DLIBUDF  -g -O2   -c -o lib_udf_la-hll.lo `test -f 'hll.c' || echo './'`hll.c
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I../../../.. -I. -I.. -I./.. -I../../../include -I./../../../include -I../../../common -I./../../../common -I../../../storage -I./../../../storage -I../../../server -I./../../../server -I../../../../monetdb5/modules/atoms -I./../../../../monetdb5/modules/atoms -I../../../../monetdb5/modules/kernel -I./../../../../monetdb5/modules/kernel -I../../../../monetdb5/mal -I./../../../../monetdb5/mal -I../../../../monetdb5/modules/mal -I./../../../../monetdb5/modules/mal -I../../../../monetdb5/optimizer -I./../../../../monetdb5/optimizer -I../../../../clients/mapilib -I./../../../../clients/mapilib -I../../../../common/options -I./../../../../common/options -I../../../../common/stream -I./../../../../common/stream -I../../../../gdk -I./../../../../gdk -DLIBUDF -g -O2 -c hll.c  -fPIC -DPIC -o .libs/lib_udf_la-hll.o
/bin/bash ../../../../libtool --tag=CC --mode=compile gcc -DHAVE_CONFIG_H -I. -I../../../..  -I. -I.. -I./.. -I../../../include -I./../../../include -I../../../common -I./../../../common -I../../../storage -I./../../../storage -I../../../server -I./../../../server -I../../../../monetdb5/modules/atoms -I./../../../../monetdb5/modules/atoms -I../../../../monetdb5/modules/kernel -I./../../../../monetdb5/modules/kernel -I../../../../monetdb5/mal -I./../../../../monetdb5/mal -I../../../../monetdb5/modules/mal -I./../../../../monetdb5/modules/mal -I../../../../monetdb5/optimizer -I./../../../../monetdb5/optimizer -I../../../../clients/mapilib -I./../../../../clients/mapilib -I../../../../common/options -I./../../../../common/options -I../../../../common/stream -I./../../../../common/stream -I../../../../gdk -I./../../../../gdk  -DLIBUDF  -g -O2   -c -o lib_udf_la-udf.lo `test -f 'udf.c' || echo './'`udf.c
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I../../../.. -I. -I.. -I./.. -I../../../include -I./../../../include -I../../../common -I./../../../common -I../../../storage -I./../../../storage -I../../../server -I./../../../server -I../../../../monetdb5/modules/atoms -I./../../../../monetdb5/modules/atoms -I../../../../monetdb5/modules/kernel -I./../../../../monetdb5/modules/kernel -I../../../../monetdb5/mal -I./../../../../monetdb5/mal -I../../../../monetdb5/modules/mal -I./../../../../monetdb5/modules/mal -I../../../../monetdb5/optimizer -I./../../../../monetdb5/optimizer -I../../../../clients/mapilib -I./../../../../clients/mapilib -I../../../../common/options -I./../../../../common/options -I../../../../common/stream -I./../../../../common/stream -I../../../../gdk -I./../../../../gdk -DLIBUDF -g -O2 -c udf.c  -fPIC -DPIC -o .libs/lib_udf_la-udf.o
/bin/bash ../../../../libtool --tag=CC   --mode=link gcc -DLIBUDF  -g -O2  -module -avoid-version  -o lib_udf.la -rpath /usr/local/lib/monetdb5 lib_udf_la-hll.lo lib_udf_la-udf.lo  ../../../../monetdb5/tools/libmonetdb5.la ../../../../gdk/libbat.la 
libtool: link: gcc -shared  -fPIC -DPIC  .libs/lib_udf_la-hll.o .libs/lib_udf_la-udf.o   -Wl,-rpath -Wl,/home/mping/workspace/monetdb/MonetDB-11.13.5/monetdb5/tools/.libs -Wl,-rpath -Wl,/home/mping/workspace/monetdb/MonetDB-11.13.5/gdk/.libs ../../../../monetdb5/tools/.libs/libmonetdb5.so ../../../../gdk/.libs/libbat.so  -O2   -pthread -Wl,-soname -Wl,lib_udf.so -o .libs/lib_udf.so
4

1 に答える 1

1

int const SHIFT_TABLE[1024] = {...}ヘッダー ファイルで配列を定義する場合。そしてc、同じプロジェクト内の 2 つのファイルでヘッダー ファイルを参照します。これは、2 つのcファイルで配列を 2 回定義するようなものです。それがあなたの問題の原因です。

それを使用しても、2番目のファイル#ifndefに定義を含める前処理を回避することはできませんC

プリプロセッサから#ifndef :

標準ヘッダーは任意の順序で含めることができます。それぞれが特定のスコープに複数回含まれる場合がありますが、1 回だけ含まれるのと同じ効果があります。

前処理コードで、配列が 2 回定義されていることがわかりますが、これは間違っています。前処理コードを生成できますgcc -E

#ifndef同じヘッダーファイルではなく、異なるヘッダーファイルで定数マクロをチェックする場合にのみ機能します

この問題を回避するために、ファイルの 1 つで配列を定義できcます。そしてextern、ヘッダーファイルのように配列を定義します

Cファイルの1つで

int const SHIFT_TABLE[1024] = {...};

ヘッダー ファイル内:

extern int const SHIFT_TABLE[1024];
于 2012-12-26T10:44:39.137 に答える