問題タブ [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 - 複数の定義ライブラリとヘッダーのみのライブラリ
いくつかの c および h ファイルを含む C プログラムがあります。プログラムの一部を「ヘッダーのみ」にすることにしたので、コードを c から h に移動しました。現在、倍数定義の問題が発生していますが、その理由がわかりません。例えば:
utils.c のすべてを utils.h に移動しました (もちろん、プロジェクトから utils.c を削除しました)。utils.h は次で始まります
ガードが一意であることを確認するために、変更してみました (例: UTILS718171_H_) が、機能しません。
それでも、コンパイラは不平を言います:
問題は次のようなものかもしれません.すべてのcファイルがコンパイルされ、独自のバージョンのコードが取得され、リンク時に問題が発生しますが、正直なところ、この問題を解決する方法がわかりません.
c++ - ヘッダーで奇妙な複数の定義エラー
プロジェクトに奇妙な複数の定義エラーがあります。#ifndef
同じファイルが複数回含まれるのを避けるために、プリプロセッサコマンドを使用しています。他のすべてのコードをクリアしました。これが私の簡略化されたファイルです:
1-main.cpp
2-IP.cpp
3-IP.hpp
win7でコードブロックとgnugccを使用すると、次のようになります。
obj \ Debug \ main.o:C:\ Users \ aaa \ Documents \ prg \ ct3 \ main.cpp |4|最初にここで定義|
|| ===ビルドが完了しました:1エラー、0警告=== |
他のすべてのコードを削除する前のエラーは次のとおりです。
|| ===エッジテスト、デバッグ=== |
obj \ Debug \ IP.o||関数`Z9getHSVLUTPA256_A256_12colorSpace3b':|
c:\ program files \ codeblocks \ mingw \ bin .. \ lib \ gcc \ mingw32 \ 4.4.1 \ include \ c ++ \ exception | 62 |`LUTColor'の複数の定義|
obj \ Debug \ main.o:C:\ Users \ aaa \ Documents \ prg \ edgetest \ main.cpp |31|最初にここで定義|
|| ===ビルドが完了しました:2つのエラー、0の警告=== |
そして、「LUTColor」はIP.hppにあります!
どうしたの?
qt4 - 複数の定義エラー: 1 つは私のファイルにあり、もう 1 つは moc ファイルにあります。
FindAndReplaceBar というクラスがあり、その実装は次のとおりです。
プログラムを実行すると、関数の複数の定義の問題が発生します。
findNext()
, findPrevious()
, replace()
, replaceAll()
.
もう 1 つの定義は、moc_FindAndReplaceBar.cpp ファイルで行われます。何が問題なのかわからないので、それを修正する方法がわかりません!助けていただければ幸いです、ありがとう!
c - エラー: 複数の定義
3 つのソース ファイルと 1 つのヘッダー ファイルを含むカーネル モジュールを作成しています。コンパイルすると、次のエラーが表示されます。
struct info
問題は、コンパイラが定義を複数回取っていることだと思います。しかし、解決策は何ですか?はstruct info
、ヘッダー ファイルで宣言されています。ヘッダーファイルは次のとおりです。
c - 複数の定義と、C プログラムで最初に定義されたもの
APUE (Stevens の「UNIX 環境での高度なプログラミング」) を読んでいるので、宣言された自己定義関数を含むファイル「apue.h」があります。WAIT_CHILD
「apue.h」で宣言された関数を定義する「wait.c」という名前のファイルを作成しWAIT_PARENT
、14.6.c がメイン関数です。
err_ret
定義されていないだけで使用されるので、何が問題なのですか??
待って.c
上記のコードは、私の「wait.c」ソース ファイルです。私はちょうど使用しますerr_sys
。以下は、リンク コマンド ラインと、表示されるリンカー エラー メッセージです。
c++ - クラスメソッドの多重定義
ファイル long_arithm.cpp があります。
今、ビルドしようとしていますが、エラーがあります (1 行目と 2 行目 - Eclipce ヘッダー):
(注: 行リンク (:188 など) は壊れています。これは、コードのコメント行を大量に捨てたためです。)
なぜそのエラーが発生し、何を修正する必要があるのですか? わかる範囲で、
その他は「事前定義」であり、そのメソッドの他の定義はありません。
ご協力ありがとう御座います。
c++ - Multiply で定義された構造体/クラスをエラーとして扱うように ld を設定するにはどうすればよいですか?
編集--私の質問の目標を明確にする:リンカーが報告することを期待している問題の診断に多くの時間を費やしています.別のものに変更し、それを変更します。
コンパイル/リンク時にこの問題を検出する方法を探しています。
このセットアップでは:
ああ
A.cpp
main.cpp
A
structureまたは少なくとも constructorA::A()
が 2 回定義されていることをリンカーに報告してもらいたいと思います。
ただし、g++ 4.4 は問題なくリンクします。コードを実行すると、この場合、リンカがA
from A.cpp の使用を選択したことがわかります。
関数 が 2 つのオブジェクト ファイルに存在する場合foo()
、リンカーは複数の定義を問題なく報告しますが、構造体については報告しません。
編集: nm -C *.o
Ao と main.o の両方が弱いシンボルA::A()
として定義されていることを使用して発見されました。これにより、同じ名前のシンボルのプールから「選択可能」になります。おそらく、この質問は「コンパイラに強力なシンボルを生成させるにはどうすればよいですか?」と言い換えることができます...
この問題を検出するにはどうすればよいですか?
c++ - 静的配列クラス変数「複数定義」C++
静的 int 配列であるクラス変数が必要なコードを書いています。ヘッダーファイルで次のようなものを使用してこれを実行できることを理解しています。ああ:
このヘッダーを他の 1 つのファイル (次の main.cpp のようなもの) にのみ含める場合、これは問題なく機能します。
しかし、クラス A をもう少し複雑にする必要があり、A.cpp ファイルも必要だとします。main.cpp ファイルは同じままにしますが、Ah を次のように変更します (関数 printA を追加しただけです)。
そして、ファイル A.cpp で:
gcc -o Ao -c A.cpp で Ao をコンパイルしても問題ありません。しかし、main.cpp (gcc -o atest main.cpp Ao) をコンパイルするときにこれをリンクすると、「'A::a' の複数定義」で失敗します。
私は解決策を求めてインターネットを精査してきましたが、ヘッダーで宣言された変数を複数の場所に含めると「複数定義」エラーが発生する人を見つけました。解決策は、変数 extern をヘッダーを定義し、それを 1 つのソース (非ヘッダー) ソース ファイルでのみ定義します。しかし、クラス変数を static と extern の両方で宣言することはできませんよね? 試してみるか、単に extern を宣言すると、変数が静的ではないという警告が表示されます (両方を試すと、「競合する指定子」エラーも発生します)。
それで、私の質問: ヘッダー ファイルを複数のソース ファイルに含める必要がある場合、静的配列クラス変数を使用することは可能ですか? もしそうなら、どのように?
c++ - C++11 ラムダとテンプレートがリンカーの奇妙な動作を引き起こす
私のコードでは、いくつかのテンプレート パラメーターに依存するラムダ式を含む関数テンプレートを取得しています。最近、おそらく g++ コンパイラの更新が原因で、リンカ エラーが発生しましたが、残念ながら正確にはわかりません。
この問題を示す小さな例を挙げます。これはリンカーの問題であるため、デモ用にいくつかのファイルを作成する必要があります。共通common.hpp
のテンプレート関数を含む 、その関数を利用するa.cpp
/a.hpp
とb.cpp
/の 2 つのモジュール、および関数を含むモジュールがあります。b.hpp
main.cpp
main
ファイルa.cpp
:
ファイルa.hpp
ファイルb.cpp
:
ファイルb.hpp
ファイルmain.cpp
を使用してコンパイルおよびリンクする場合
multiple-definition
エラーが発生します:
基本的に、ラムダ式はすでにaで定義されていると言います。わかった。テンプレート パラメータをb
5 から 7 に変更すると、すべてが機能します。
質問:
- これは私が期待すべきことですか、それとも のバグ
g++
ですか? 私はこのコードを以前のバージョンの の debian パッケージでコンパイルしたことを確信していますg++-4.7
。 - ラムダを使用しない以外に回避策はありますか? 結果のシンボルが静的であれば、たとえば問題はないと思います。更新: 回避策: my_transform
static
またはinline
.
この質問はあまり重要ではありません。「ここではラムダを使用しない」というアプローチで問題はありませんが、私は興味があります。:)
javascript - Javascriptで配列を定義する
最初に変数を定義している間、2番目の2D配列を定義できません。なんで?それはどのように行われるべきですか?