問題タブ [multiple-definition-error]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
9 に答える
38664 参照

c++ - 複数の cpps に同じヘッダーを含めることによる複数の定義エラーの繰り返し

したがって、私が何をしようとも、同じプロジェクト内の複数のソース コード ファイルに同じヘッダー ファイルをインクルードした結果、Dev C++ が多数の複数定義エラーを吐き出すことを避けられないようです。すべてのソース コードを 1 つのファイルにダンプし、ヘッダーを 1 回だけインクルードする必要はありません。ファイルが非常に長くなり、管理が難しくなるためです。

本質的に、これは何が起こっているかです:

Cpp ファイルの例 (ほとんどすべて次のようになります):

この 1 つのヘッダーを含む約 5 つの cpp ファイルがあり、それぞれがヘッダー ファイルにある異なるタイプの構造体を扱っていることに注意してください。この例では、実際のヘッダー ファイルにはさらに多くのメンバーを持つ約 4 ~ 6 個の異なる構造体があるのに、いくつかのメンバーを含む構造体は 1 つしかありませんでした。これを含めたすべてのファイルは、この例で見られるのと同じ式に従います。

これで、ヘッダー ガードは個々の cpp ファイルがヘッダー ファイルを複数回インクルードするのを防ぐだけであることがわかりました。何が起こっているように見えるかは、コンパイラが各 cpp の開始時にインクルードを読み取るときに、ヘッダー ファイルを最初から定義し直して、次の行と行を吐き出すことです。

ヘッダーを含むプロジェクト内のほぼすべての cpp ファイルで、このセットが表示されます。構造体と構造体変数の定義をcppファイルに移動しようとしましたが、他のcppファイルはそれらを表示したり操作したりできません。プロジェクト内のすべてのファイルが機能する必要があるため、これは非常に重要ですこれらの構造体で。

しかし、この問題で最も紛らわしい部分については、もう少し説明が必要です。

このプロジェクトでこれらの複数のファイルをセットアップする方法は、私が作業している本、John S. Harbour による All In One Game Programming と同じです。同じプロジェクト内の複数の cpps によって含まれる 1 つのヘッダーを要求する本のサンプル プロジェクトのファイルを作成したときに、まったく同じ問題に遭遇しました。

私はそれらを本から一語一語入力することができました、そして私は一語一語を意味します...
そして私はプロジェクトのすべてのcppについて一連のMDエラーを得るでしょう.

本に付属の CD からサンプル プロジェクトを読み込んだ場合、問題なくコンパイルおよび実行されますが、ファイル自体とプロジェクト オプションは、私が作成したものとまったく同じように見えます。

独自のプロジェクト ファイルを作成し、サンプル プロジェクトのソース ファイルとヘッダー ファイルを CD から追加しただけでも、これもコンパイルおよび実行されますが、それらと私の違いはわかりません。

それで、私は自分のプロジェクト ファイルを作成し、空のソース ファイルとヘッダー ファイルを作成してそれに追加し、対応するはずの CD 上のファイルから内容をコピー アンド ペーストして埋めてみました (同じ働いていたもの)。確かに、私は同じことを得るでしょう...何行ものMDエラーメッセージ。

私は絶対に困惑しています。これらすべての方法を何度も繰り返しましたが、コードの入力ミスやミスコピーではないことを確信しています。事前に作成されたファイル自体に何かがあるようです。いくつかの構成設定または私が完全に欠落している何か...それにより、自分で作成したファイルは正しくコンパイルされませんが、正しくコンパイルされます。

0 投票する
8 に答える
180993 参照

c - Cで複数の定義を防ぐ方法は?

私は C の初心者で、Code::Blocks を使用してコンソール アプリケーションを作成しようとしていました。(簡略化された) コードは次のとおりです: main.c:

test.c:

このプログラムをビルドしようとすると、次のエラーが発生します。

テストを複数定義する方法はありません (ただし、アンダースコアがどこから来ているのかはわかりません)。定義が何らかの形で 2 回含まれている可能性は非常に低いようです。これがすべてのコードです。

このエラーは、test または test.c と呼ばれる他の関数またはファイルとの名前の競合によるものではないことを除外しました。複数の定義と最初の定義は、同じファイルの同じ行にあることに注意してください。

これを引き起こしている原因と、それに対して何ができるかを誰かが知っていますか? ありがとう!

0 投票する
4 に答える
2837 参照

c++ - ベクトル複数定義リンク エラー

vector は 1 つのソース ファイルにのみ含まれています。ヘッダー ファイルに含まれる stl は文字列のみです。それでも、複数の定義エラーを取り除くことはできません (以下の例)。何か案は?

./plugin_dfb.o:mipsel-linux-uclibc/include/c++/4.2.0/bits/stl_bvector.h:182: `std::operator-(std::_Bit_iterator_base const&, std::_Bit_iterator_base const&) の複数定義' ./painter.o:mipsel-linux-uclibc/include/c++/4.2.0/bits/stl_bvector.h:182: 最初にここで定義

0 投票する
3 に答える
3543 参照

c++ - リンク時の多数の std:: 関数の複数定義

外部コードをアプリケーションに統合しようとしています。私のコードは純粋な C でしたが、新しいコードは C++ であるため、C ファイルの名前を .cc に変更し、すべてを g++ でコンパイルしました。

正常にコンパイルされますが、リンク エラーが大量に発生します。

私は Cmake を使用してビルドしていますが、それほど複雑なことはありません。私のコードは単なるメソッドの集まりであり(stdパッケージから何も使用していません)、統合しようとするコードはそれほど複雑ではないため、なぜこれらすべてのエラーが発生するのかわかりません。

警告は、(まだ) 新しい C++ コードからではなく、自分のコードをリンクすることで発生することに注意してください。

誰か?

編集: 統合しようとする外部コードを掘り下げた後、いくつかのインクルードが見つかりました:

また、iostream は他のヘッダーにも含まれており、それらすべてにインクルード ガードがあります。

更新:外部コードを少しきれいにして、不要な依存関係を削除することができました。まだいくつかのリンカ エラーがありますが、はるかに少ないです:

コードには と の両方が含まれてcmathおりcstdlib、デフォルトの名前空間を使用して abs およびその他の関数を参照しています。これが問題でしょうか?

0 投票する
2 に答える
221 参照

c++ - How to change the meaning of pointer access operator

This may be very obvious question, pardon me if so.

I have below code snippet out of my project,

Question
Can I change the meaning of the ptr[index] ? Because I need to return the value of ptr[a[index]] where a is an array for subindexing. I do not want to modify existing source code. Any new function added which can change the behavior is needed.

Since the access to index operator is in too many places (536 to be precise) in my code, and has complex formulas inside the index subscript operator, I am not inclined to change the code in many locations.


PS :
1. I tried operator overload and came to conclusion that it is not possible.
2. Also p[i] will be transformed into *(p+i). I cannot redefine the basic operator '+'.

So just want to reconfirm my understanding and if there are any possible short-cuts to achieve.
Else I need fix it by royal method of changing every line of code :) .

0 投票する
3 に答える
1300 参照

c++ - C++複数定義エラー

この質問に対するsthの回答から始めます。

次のコードが異なる.ccファイルに複数回インクルードされてリンクされているヘッダーファイルに入れられた場合、複数の定義エラーを解決する方法を考えていました。

0 投票する
4 に答える
195 参照

c++ - 'main' もある .cpp ソース ファイルから関数をリンクするにはどうすればよいですか?

.cpp ソース ファイルに main 関数がある .cpp ソース ファイルからいくつかの関数を使用したいと考えています。(make と gcc でビルドしています。)

Makefile のルールは次のとおりです。

そして、ここに出力があります(気を散らすのを防ぐためにいくつかの名前が変更されています):

foo.cpp からメインを使用したいことを gcc に示すにはどうすればよいですか?

更新:「bar.cpp」は「他の誰かの」コードであり、メインの独自の理由があることを追加する必要がありました。(共有関数を別のファイルに分割するために、他の誰かと協力する必要があるようです。)

0 投票する
1 に答える
12611 参照

c++ - 以前にリンクしていたファイルに関数を追加した後の複数定義リンカエラー

だから私のプログラムはうまく機能しています。コンパイル、リンク、実行、作業。次に、次のような単純な関数をファイルの1つに追加することにしました。

その関数定義は、コードに加えた唯一の変更です。他のすべてはそれがあったのとまったく同じです。まだ何も呼ばれていません。コンパイルしましたが、リンクに失敗しました。g++は、これを含むすべてのファイルに対して次のエラーの1つを返します。

コメントアウトするisVowelと、再び機能します。名前を変更しようとしましたが、まだ機能しません。に置き換えてみましたがvoid randomFunctionName() {}、まだ動作しません。非インラインにして、関数本体をUtility.cppに入れてみましたが、まだ機能しません。私は非常に混乱しています。単純な関数を1つ追加すると、リンカーが台無しになるのはなぜですか?

0 投票する
5 に答える
3213 参照

c - インライン関数を使用して定義されたリンカーエラーを乗算する

リンカは、インライン関数に対して複数定義されたエラーを報告しています。

ヘッダーファイルに次のコードがあります。

ヘッダーファイルを複数のソース(.c)ファイルにインクルードします。

上記の関数は、どこで呼び出されてもインラインで貼り付けてもらいたいです。
含まれている各ソースファイルに関数の複数の定義がない場合のこのための手法はありますか? はいの場合、例を挙げてください。

組み込みプラットフォームのパフォーマンスを最適化する必要があります。
コンパイラまたはリンカは、他の変換単位で定義されている場合に関数をインライン化するのに十分スマートですか?

組み込みARM9プラットフォームでGreenHillsコンパイラ4.2.4を使用しています。2000より前のC言語標準を想定します。これはC++ではなくCコードです。