問題タブ [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.
c++ - extern変数は複数定義エラーを引き起こします
以前に定義された変数を使用するためにexternを使用しようとしています。
以前はexternを使用したことがありませんが、変数を1回だけ定義して複数のファイルで使用するには、externを使用する必要があります。
私はこの質問のために最小化されたバージョンのコードを書きました。私は4つのファイルを持っています
lib.h
Vehicle.h
以下は、vehicle.cppと呼ばれるVehicle.hファイルの実装です。
main.cpp
私はg++を使用しています
次のエラーが発生します:
次の出力を確認しました:
lib.hが含まれるたびに、複数の定義が発生します。
私の質問は次のとおりです。
- ガードの定義があるのにlib.hが複数回含まれているのはなぜですか
- 'extern'変数を定義し、同じファイルで初期化するにはどうすればよいですか(後で同じファイルで使用されるため)
c++ - C ++での同じシンボルの複数の定義(ビジュアルスタジオ)
chrono::engineのチュートリアルに従っている非常に単純なコードに問題がありますhttp://www.chronoengine.info/mediawiki/index.php/Demo_fourbarC++ プログラミングの経験があまりありません( Javaでの経験があるため)、C ++コードの古典的な構造に頭を悩ませるために、MyEventReceiver(チュートリアルのクラス)を別のファイル(MyEventReceiver.hおよびMyEventReceiver.cpp)で定義しようとしました。
これがコードのバージョンです
MyEventReceiver.h
MyEventReceiver.cppで次のように実装します
そしてMain_2.cppのメインファイル(私が空にした、それは私にコードの有無にかかわらず同じエラーを与えます-これは基本的に3DエンジンIrrlichtとchrono :: engineの衝突モデルからのいくつかの力学機能をセットアップするだけです)
基本的に、コードはイベントレシーバーを定義するため、プログラムを実行した後、ユーザーはGUI操作を介してchrono :: engineおよびIrrlichtエンジンから構築された3D環境と対話できます。MyEventReceiver.hファイルで必要なすべてのライブラリと、必要なライブラリを定義します。名前空間
問題は、コンパイルされないことです(同じ#includeを使用し、1つのファイルで名前空間を使用して、別のプロジェクトで動作していたエンジンをすでにテストしていることに注意してください)、問題は構造に起因していると思いますヘッダーファイルの
私はそれらのエラーの行を取得しました
など...(このように続きます)そして最後の間違い
Visual Studio 2010C++を使用しています。私は1つのグローバルソリューションを定義し、このソリューションのいくつかのプロジェクト(上記で書いたプログラムはとりわけ1つのプロジェクトです)は、かなり簡単に解決できるはずですが、実際には解決策を見つけることができません。詳細が必要な場合はお知らせください
どうもありがとうヴィンセントよろしく
編集:次のようにすべてのコードを1つのファイルに入れた場合
そのようにして、インラインとして定義されていないIrrlicht3Dエンジンの関数を何度も定義することを避けます。残念ながら、プロジェクトが大きくなると(3Dエンジンに依存するすべてのクラスを1つの一意の.cppファイルで定義する必要がある)、このコーディング方法は非常に面倒になる可能性があります。複数を回避できるように、従うべきデザインパターンはありますか。各クラスが個別のファイルで定義された定義済みオブジェクト?
どうもありがとう
一番
ヴィンセント
c++ - 同じexeの複数の関数で共有ライブラリの静的変数を使用するが、オブジェクトファイルは異なる
(元の質問を編集して、より理解しやすくしました)
これが問題のプロトタイプです....
//Txn.h --- これには静的変数があり、それを含む pgms で使用できます。
//Txn.cpp
-> LibTxn.so
//class1.cpp を作成 -> Txn.h の静的変数を使用して pgm の 1 つを生成
-> LibTxn.so を使用して class1.o を生成します。
// class2.cpp -> Txn.h の静的変数を使用する別の pgm
-> LibTxn.so をインクルードして class2.o を作成
-> class1.o,class2.o を使用して class3 (exe) を作成 class1 と 2 の両方に "Txn.h" から "Txn::i=0" というステートメントがあるため、複数の宣言の問題が発生します。
-> .Txn.h から "Txn::i=0" ステートメントを削除すると、"undefined reference" エラーが表示されます。
-> .高レベルでは、この問題は一種のセッション変数を持つことであり、exe 内の任意の func から評価できるはずです。これらの関数は、exe を形成するために使用される任意の obj ファイルに含めることができます。静電気がなくても、どんなソルでも大丈夫です。しかし、別の .o ファイル (このセッション var を使用している) の作成を変更し、.o を組み合わせて exe を生成することはできません。
c++ - すべてのコンストラクター、メソッド、および演算子のオーバーロードに対する c++ 複数定義エラー
ここには既に多くの「複数の定義」に関する質問があることを認識していますが、過去 2 時間かけて説明を探しましたが、見つかりませんでした。これが重複している場合は申し訳ありません。
現在、Array.h と Vector.h の 2 つのクラスがあります。どちらもグローバル変数を持たず、どちらも他方に依存していません (つまり、Array は Vector を使用せず、Vector は Array を使用しません)。実装は .h ファイルにあります。
ここに私のMain.cppがあります:
...そして、すべて正常に動作します。ただし、 #include ステートメントのみで別の .cpp ファイルを作成すると...
DataReader.cpp
...その後、すべてが爆発し、Vector のすべてのメソッド、コンストラクター、および演算子のオーバーロードに対して大量のエラーが発生します。
しかし#include "Array.h"
、DataReader.cpp だけを持っていれば、すべて正常に動作します。
#include "Vector.h"
に当てはまらないことの何が間違っている可能性があります#include "Array.h"
か?
編集: 実装を .cpp ファイルに分割するとエラーが修正されますが、配列ではなくベクトルに対してそれを行う必要がある理由が説明されていません。
c++ - c ファイルの .h を含めると、奇妙な「複数定義」エラーが発生しますか?
c
ソースファイルとソースファイルの両方を含むプロジェクトに取り組んでいc++
ます。
私は次のようなコードを使用します:
c ファイルをインクルードします。
しかし、.h
ファイルのない c のファイルを取得しました.c
。そして、それは(私が思うに)次の多くのエラーを引き起こします:
ここPeriodicFaultReport
でFaultActiveEventReport
、、、、FaultInactiveEventReport
はFaultLatchEventReport
すべて宣言されて"DataStruct.h"
おり、このファイルにはファイルがありません.c
。
PeriodicFaultReport
その上、FaultActiveEventReport
、FaultInactiveEventReport
、FaultLatchEventReport
がすべてであることに気付きましたglobal variables
。
[重要]
"DataStruct.h"
内の相対コンテンツc
:
hereのような答えがあるかもしれませんが、
正しくありません。プロジェクト
からすべてのファイルを取得すると、他の .h ファイルに複数回含まれていますが、問題はありません。
(プロジェクトは にあり、これが問題のない理由かもしれません)
しかし、これは本当ですか、これに役立ち、標準を破りますか?c
"DataStruct.h"
c
VS2008
VS
c
c++ - 複数定義の場合、char* と char[] に違いがあるのはなぜですか?
interface.h で strInterface を定義する
/li>OneUsing クラスでは、strInterface 文字列が呼び出されます
/li>main.cpp では、strInterface が直接呼び出されるため、interface.h が含まれます。OneUsing インスタンスが作成されるため、oneUsingInterface.h も含まれます。
/li>さて、発生する問題:
/li>ただし、strInterface が次のように定義されている場合、問題はありません。
/li>
この場合のchar*
との違いについてもっと詳しく教えてくれる人がいますか?char[]
PS: ヘッダー ファイルでキーワードを使用してグローバル変数を宣言しextern
、誰かの実装ファイルで定義することがよくあります。