• ベストアンサー

LNK2005

Visual C++ Version5.0を使っています。 OSはWindows XPです。 translator.cpp parser.cpp scanner.h という三つのファイルをビルドしようとすると translator.obj : error LNK2005: "int error_flag" (?error_flag@@3HA) は すでに parser.obj で定義されています というエラーがそれぞれの変数ごとに20個出て、最後に ebug/COSC47101.exe : fatal error LNK1169: 1 つ以上の複数回定義されているシンボルが見つかりました link.exe の実行エラー と表示されます。それらの変数はすべて"scanner.h"で定義されており、 二つの.cppファイルがincludeしているのが原因だということは分かっています。 しかし、どうやって解決すればよいのでしょうか? 過去ログを参考にして二つの.cppファイルの中で #if !defined(HOGE_X) #define HOGE_X #endif //include files #include "scanner.h" とやっても全然駄目です。 どうか解決するまで手取り足取り教えてください。 お願いします。m(__)m

質問者が選んだベストアンサー

  • ベストアンサー
  • Senna_FF
  • ベストアンサー率45% (153/334)
回答No.5

もう少しがんばりましょうか。 1.次はコンパイルエラーが出たようですが、これはエラーの内容そのままです。  「token」なる変数の型はなんですか?と聞いています。  型をユーザ定義の、クラスや構造体等にしていませんか?  また、その型定義を「scanner.h」でしていませんか。  当初は、リンケージエラーでお困りのようでしたから、「scanner.h」参照時は、  コンパイルは通っていたことになります。  まずは、そこまで戻りましょう。 2.次にANo.3のqwertyfさんがおっしゃるように、ソースに手を加えてください。  (1)「scanner.h」の「error_flag」変数を、extern宣言する。      → extern int error_flag;  (2)「translator.cpp」、「parser.cpp 」では、そのまま「scanner.h」をインクルードする。  (3)「translator.cpp」もしくは「parser.cpp 」のどちらかに、「error_flag」の実態を宣言します。      → int error_flag;   3.コレで駄目なら、もう一手。qwertyfさんがおっしゃるとおり、ソース公開してみては。   少なくとも「scanner.h」の、変数宣言部は欲しいですね。 ちなみに、"LNK2005"でサイト検索すると、うれしいことが起こるかもです。 (結構くわしく解説してるかたが・・・)

sucker
質問者

お礼

#4さんのお礼に書きましたとおり、自分の勘違いが原因でした。 深く反省するとともに今後は同じ過ちを繰り返さないように努めたいと思います。 ありがとうございました!

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (4)

  • qwertyf
  • ベストアンサー率51% (14/27)
回答No.4

#3です。 エラーを見るとやはりなんか別の原因っぽいですね… C2501: 'token' : 識別名を宣言するのに、型が指定されていません。 というのは型名が宣言されていないのにその型を使ってしまっている 時によく出るエラーです。 構文エラーは文法が間違っていたりすると出ます。 出来ればエラー周辺のソースを出してくれると有り難いのですが…

sucker
質問者

お礼

大変、申し訳ないです。m(__)m 結論から申しますと、translator.cppとparser.cppは別々にビルドされるべきだったようです。 もともとこれらのファイルは二年前のプロジェクトで作ったもので そのときにうまく動いていたことは覚えていたのですが 別々にビルドしていたことはすっかり忘れていました。 何が原因なんだろう?とまじまじと見てみると translator.cppにもparser.cppにもmain()があることに気付きました。 ←もっと早く気付け よって →parser.cppをクリック →設定… →一般タブ →「このファイルをビルドしない」にチェック →OK で解決です。本当に一緒にビルドするのであればヘッダーの名前を変えて変数名も 変えてやる必要があるでしょうね。幸運にもtranslator.cppとparser.cppとの間に データのやり取りはありません。(ですから別々でよい訳ですが) 自分の勘違いのせいで面倒を掛けてすみませんでした。 ポイントを差し上げ次第速やかに逝ってきます。 ありがとうございました!

全文を見る
すると、全ての回答が全文表示されます。
  • qwertyf
  • ベストアンサー率51% (14/27)
回答No.3

1.どこかしらの cpp ファイルに変数の「実体」を定義します。 translator.cpp, parser.cpp, あるいは新しく作った cpp ファイルの中で、 int a, b; のように変数を定義します。 2.どこかしらのヘッダーファイルで変数を外部参照することを宣言します。 この場合 scanner.h ですね。また新たにヘッダーを作っても構いません。 その中で先ほどの定義と同じものを、行の先頭に extern を付けて書きます。 extern int a, b; といった感じ。 3.該当する変数を参照する cpp ファイルに2のヘッダーファイルをインクルードします。 translator.cpp, parser.cpp に #include "scanner.h" のように追加すればOKです。 #if 文などでごちゃごちゃした処理をする必要もないと思います。 これで大丈夫かな・・・?

参考URL:
http://okuyama.mt.tama.hosei.ac.jp/unix/C/slide84-1.html
sucker
質問者

お礼

手順に沿ってやってみましたがうまくビルドできませんでした。 エラーの数やメッセージにはまったく変化がありません。 translator.cppを含めるとうちの教授でも解決できませんでしたから 質問に書いたよりも何かもっと複雑な問題なのかもしれません。 まだ、解決の方法が残されているのであればお聞きしたいのですが ないようであれば締め切ってポイントを差し上げます。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • Senna_FF
  • ベストアンサー率45% (153/334)
回答No.2

すいません。まったく見当違いな回答してました。 そもそもこのエラー内容は、error_flagという変数の実体があちこちにあるという エラーですよね。(外部変数にしてますよね?) translator.cppではこの変数へのアクセスはあるのですか? ないのならば、ヘッダをインクルードしない。 あるなら、ヘッダはインクルードせず変数をextern宣言してください。

sucker
質問者

お礼

はい、translator.cppでもこの変数へのアクセスはあります。 ヘッダをインクルードせず変数をextern宣言しましたが 今度はscanner.hで他に定義されている変数について怒られ、エラーは70個に増えました。 translator.cpp C:\Program Files\DevStudio\MyProjects\COSC47101\translator.cpp(15) : error C2501: 'token' : 識別名を宣言するのに、型が指定されていません。 C:\Program Files\DevStudio\MyProjects\COSC47101\translator.cpp(15) : error C2239: 無効なトークン 'identifier' が 'token' の宣言の後にあらわれました。 C:\Program Files\DevStudio\MyProjects\COSC47101\translator.cpp(15) : error C2061: 構文エラー : 識別子 'next_token' がシンタックスエラーを起こしました。 ↑こんな感じで70個 実は前回取っていたクラスの教授に見てもらい、今回はtranslator.cppはいらんだろう(recursive descent parserがいるだけ)ということで parser.cppとscanner.hだけでビルドしてうまくビルドできました。 ただ、translator.cppもそのうち使うことになるんで解決しておきたいです。 何か間違っていますでしょうか? まだ他に解決方法はありますか?

sucker
質問者

補足

お礼を書くのを忘れていました。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • Senna_FF
  • ベストアンサー率45% (153/334)
回答No.1

↓#if のネスト内に#includeを書き込まないと意味ないと思いますが。 #if !defined(HOGE_X) #define HOGE_X //include files #include "scanner.h" #endif

sucker
質問者

お礼

ありがとうございます。 ご指摘通りにしましたが、結果はまったく同じです。 parser.cppは #if !defined(HOGE_X) #define HOGE_X #include "scanner.h" #endif translator.cppの方には標準のヘッダー<string.h>がありますので #include <string.h> #if !defined(HOGE_X) #define HOGE_X #include "scanner.h" #endif としました。何か間違いなどがあればまたご指摘お願いします。m(__)m

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 名前空間でビルドエラー(LNK2005)

    C++の名前空間について勉強しています。 ソースを組んでビルドしようとしたところ、以下のようなエラーが表示されました。 > error LNK2005 "int test::count" は既に main.obj で定義されています。 > fatal error LNK1169: 1つ以上の複数回定義されているシンボルが見つかりました。 変数が多重定義(?)されているというエラーであることはわかるのですが、 その対処法が分からず困っています・・・。 わかる方がいればアドバイスください。 よろしくお願いします。 --------------------------------------- ○main.cpp #include "ns.h" int main(){  test::hoge(); } ○ns.h #pragma once namespace test {  int count;  void hoge(); } ○ns.cpp #include <iostream> #include "ns.h" void test::hoge(){  std::cout << "hoge()が呼ばれた" << test::count++ << "回目" << std::endl; }

  • 多重定義が起きている?--lnk2005エラー:VC++

    今つまずいている問題は、VC++2008環境下で、以下のような構造になっているプログラムにおいて、多重定義?されているのでコンパイルが通らないというものです。 ソースコードを載せることは大きすぎてできないので、問題となる部分の記述のみ抽出して書きます。 -------define.h---------- ・・・・(module.h内の関数に使われる型の定義など) --------------------------- -------module.h---------- #include "define.h" void mod_1(void){・・・} void mod_2(void){・・・} --------------------------- このように、2つのヘッダーファイルがあり、define.hをインクルードしてmodule.hを使うという構造です。 (一般的ではないようですが、module.h内にmod_1やmod_2の実体を書き込んでいます。) その中で、以下のようなcppソースファイルがあります。 -------Main.cpp---------- #include "module.h"   (他のMain.cpp内の関数の都合上、Main.cppでもmodule.hをインクルードしています。関係あるかもしれないと思い書きました。) int main(){ M(); N(); } ------------------------ -------M.cpp---------- #include "module.h" void M(void){ mod_1(); mod_2(); } ---------------------- -------N.cpp---------- #include "module.h" void N(void){ mod_1(); mod_2(); } ---------------------- とすると、コンパイルの結果は次のようになります。 1>N.obj : error LNK2005: "void __cdecl mod_1(void)" (?mod_1@@YAXXZ) は既に M.obj で定義されています。 1>N.obj : error LNK2005: "void __cdecl mod_2(void)" (?mod_2@@YAXXZ) は既に M.obj で定義されています。 多重定義や多重インクルードは起こしていないと思っていますが、M.cppとN.cpp内の定義が衝突する理由がわかりません。どなたか理由が思いつく方、教えていただけたら幸いです。お願いいたします!! ◆◆◆   ◆◆◆   ◆◆◆   ◆◆◆   ◆◆◆ ちなみに、たとえばMやNとまったく同じ「A.cpp」を作り、このように書いたとします。 -------A.cpp---------- #include "module.h" void A(void){ mod_1(); mod_2(); } ---------------------- そしてmain関数の中に、MやNと同様に『A();』を付け加えたとします。 すると、実行結果はこのようになります。 1>M.obj : error LNK2005: "void __cdecl mod_1(void)" (?mod_1@@YAXXZ) は既に A.obj で定義されています。 1>M.obj : error LNK2005: "void __cdecl mod_2(void)" (?mod_2@@YAXXZ) は既に A.obj で定義されています。 1>N.obj : error LNK2005: "void __cdecl mod_1(void)" (?mod_1@@YAXXZ) は既に A.obj で定義されています。 1>N.obj : error LNK2005: "void __cdecl mod_2(void)" (?mod_2@@YAXXZ) は既に A.obj で定義されています。 VC++はファイル名のアルファベット順にコンパイルするようですが、どちらにせよmain関数内で呼び出されていること以外何の関わりも無いはずのA、M、Nの中での出来事が、衝突する理由が、調べども思い当たりません。 お願いいたします。

  • C++のファイル分割でのエラーについて

    最近VC2008でC++の勉強を始めたのですが、ファイル分割でLNK2005エラーというのが発生し、解消できません。 インクルードガードは行ったのですが、どうしたらよいのか分かりません。 ソースコードはこんな感じです。 //main.cpp #include "sub.h" #include "res.h" bool main(){ calcx(m_x); calcy(m_y); } //res.h 共有変数の宣言 #ifndef __RES_H #define __RES_H int m_x; int m_y; #endif //sub.h 関数のプロトタイプ宣言を行う void calcx(); void calcy(); //sub.cpp 関数の定義を記述する #include "res.h" void calcx(int x){ m_x = x + 100; } void calcy(int y){ m_y = y + 200; } エラー: 1>Main.obj : error LNK2005: "int m_x" (?m_x@@3HA) は既に sub.obj で定義されています。 1>Main.obj : error LNK2005: "int m_y" (?m_y@@3HA) は既に sub.obj で定義されています。 上記のようなエラーを解消するにはどうしたら良いのでしょうか。 何がおかしいのか指摘をお願いします。

  • C++でのエラー LNK2001

    C++でプログラミング中ビルドしたところ以下のようなエラーが出ました。解決方法がわかりません。どのようにしたら解決できるのでしょうか? ---------------------------------------------------------------- コンパイル中... sample01.cpp リンク中... sample01.obj : error LNK2001: 外部シンボル "__imp__dispose_library" は未解決です sample01.obj : error LNK2001: 外部シンボル "__imp__get_copyright_information" は未解決です sample01.obj : error LNK2001: 外部シンボル "__imp__get_version_information" は未解決です sample01.obj : error LNK2001: 外部シンボル "__imp__initialize_library" は未解決です sample01.obj : error LNK2001: 外部シンボル "__imp__close_reader_writer" は未解決です sample01.obj : error LNK2001: 外部シンボル "__imp__get_last_error_types" は未解決です Debug/Sample01.exe : fatal error LNK1120: 外部参照 6 が未解決です。 link.exe の実行エラー

  • VC++ includeファイルについて

    VC++2005でグローバル変数を利用したいと考えています。 そこで、kaisu.hというヘッダーファイルにint n=0;と書いてあります。 そこでプログラムでは、 #include "kaisu.h" しているのですが、エラーがどうしても出てしまいます。 エラーは以下の通りなのですがどのようにすれば良いのでしょうか? error LNK2005: "int n" (?n@@$$Q3HA) は既に Form2.obj で定義されています。 場所::試作品.obj エラー 2 fatal error LNK1169: 1 つ以上の複数回定義されているシンボルが見つかりました。

  • 分割コンパイルの方法がわかりません‥(Studio.NET)

    mainとsubという2つのcppファイルと各ヘッダファイルで分割コンパイルを試みましたがうまくいきません・・。 何が間違っているのでしょう・・。 エラーメッセージ error LNK2005: "char * a" (?a@@3PADA)は既にmain.objで定義されています。 fatal error LNK1169: 1つ以上の複数回定義されているシンボルが見つかりました。 と表示されます。ファイルソースは以下です。どなたか教えてください>< ----------(main.h)---------- char a[100]; ----------(main.cpp)---------- #include<stdio.h> #include "main.h" #include "sub.h" int main(){  sprintf(a,"hello.");  sub_write();  return 0; } -----------(sub.h)----------- void sub_write(); -----------(sub.cpp)------------- #include <stdio.h> #include "main.h" #include "sub.h" void sab(){  printf("%s\n",a); } return; }

  • LNK1120 エラーについて

    このエラーが出たら一体何が問題なんですか? このエラーが出た以降、Visual C++ 2008がずっと使えなくなってしまいました…。ちなみ、この時にビルドで出力されたのは SVCRTD.lib(crtexew.obj) : error LNK2019: 未解決の外部シンボル _WinMain@16 が関数 ___tmainCRTStartup で参照されました。 ■■■\Debug\tr3.exe : fatal error LNK1120: 外部参照 1 が未解決です。 …でした。 あと、入力したものは普通に #include <stdio.h> void main(){ printf ("Hello World"); } です

  • error LNK2001について

    C++ の勉強中です。 error LNK2001問題がありました。問題点も分からないから、 分かった方に教えていただけないでしょうか? ソースも添付します。環境はVS2005 express edition まず、ヘッダファイルです。ファイル名は、myheader.h #ifndef __MYHEADER_H__ #define __MYHEADER_H__ #define includeshow(x) \ { \ s.show(x); \ } class Sample{ public: void show(char * parameter); }; extern Sample s; #endif //------------------------------------------------ 次に、Sample.cppです。 #include "myheader.h" #include <stdio.h> void Sample::show(char *parameter){ printf("in show func"); } //----------------------------------------------- 最後にTest.cppです。 #include "myheader.h" #include <stdio.h> int main(){ includeshow("ppppp"); } これで error LNK2001: 外部シンボル ""class Sample s" (?s@@3VSample@@A)" は未解決です。というエラーが出ています。 よろしくおねがいします。

  • LNK2001(Pro*c)

    現在、Net8でOracleのデータを参照する、Cの関数を作成しているのですが、 自分で作成したライブラリをリンクして、呼び元をコンパイルすると (Windowsの場合)LNK2001エラーが発生します。 --------------------構成: XXXX - Win32 Debug-------------------- コンパイル中... XXXX.cpp コンパイル中... XXXX.cpp リンク中... XXXX.lib(XXXX.obj) : error LNK2001: 外部シンボル "_sqlcxt" は未解決です Debug/XXXX.exe : fatal error LNK1120: 外部参照 1 が未解決です。 link.exe の実行エラー XXXX.exe - エラー 2、警告 0 -------------------------------------------------------------- となり、UNIXだと、 -------------------------------------------------------------- 未定義の               最初に参照している シンボル               ファイル sqlcxt                XXXX.o ld: 重大なエラー: シンボル参照エラー。XXXX に書き込まれる出力はあ りません。 *** Error code 1 make: Fatal error: Command failed for target `XXXX' -------------------------------------------------------------- となり、sqlcxtを認識出来ていない様です。 ちなみにsqlcxtは、.pcをプリコンパイルすると、.cに吐かれる、 SQLLIBの関数の様です。 Pro*cのライブラリをリンク出来ていないのかと思い、現在いろいろと 調べているのですが、解決できません。 上記では、情報が不足しているかもしれませんが、どなたか御教授下さい。 宜しくお願いします。

  • 複数ファイルによる共通の外部変数定義について

    初歩的な質問なのですが、今各関数をファイルごとに分けて記述しようとしています。 ここで詰まっているのでできればご教授お願いします ファイル構成は プログラムファイル main.cpp sub.cpp ヘッダーファイル  myheader.h(main.cppとsub.cpp両方でインクルード) ヘッダーファイルには両方のプログラムファイルで使う変数が定義してあります。 それでmain.cppとsub.cpp両方で同じ変数を使いたいのですがコンパイルエラーが発生してしまいます。 内容はsub.obj側で「i(共通のループカウンタ)はmain.objですでに定義されています」というものです。 とにかく私のやりたいことはヘッダーに外部変数を定義して両方のプログラムファイルで使いたいというものです。 もしかしたらファイルを分けるにも何か設定が必要なのでしょうか? 私はただ[プロジェクト]→[プロジェクトに追加]→[新規作成]でソースファイルを作っているだけなんですが・・・ 上記の状態を回避する方法はあるのでしょうか?

筆王製品版が使えない!
このQ&Aのポイント
  • 筆王2023をダウンロードしてシリアル番号登録したが、デザイン編集時に製品版の利用を検討するようにポップアップが表示され、使用できない。
  • 再インストールしても状況が改善しないため、対策を知りたい。
  • ソースネクスト株式会社の筆王製品版を使用中に問題が発生しており、解決策を求めています。
回答を見る

専門家に質問してみよう