- ベストアンサー
分割コンパイルの方法がわかりません‥(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; }
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
エラーメッセージのとおり。 グローバル変数 char a[100]が重複します。 回避するには、main.hを書き換えましょう。↓ #ifndef hoge_main_h_included_hogehoge #define hoge_main_h_included_hogehoge char a[100]; // ←元からある部分 #endif // hoge_main_h_included_hogehoge これはむか~~しからインクルードガードと呼ばれ、 同じヘッダファイルが複数回includeされないようにする方法でござんす。 また、sub.cpp 4行目の void sab(){ は、 void sub_write(){ の誤りですよね。 最後に、コンパイル環境不明ですがリンク順も要注意かな
その他の回答 (3)
- yosi_yosi
- ベストアンサー率35% (165/468)
main.hでchar a[100]が宣言されているためです。 この状態だと、main.cppとsub.cpp両方でchar a[100]が定義されてしまうため、エラーとなります。(同じシンボル名が存在するため) 解決するためには、 main.hでは広域変数を宣言しない main.cppにてchar a[100]を宣言する sub.cppにてextern char a[]として、外部で宣言されているものを定義する とすれば大丈夫です。 本当は広域変数はできる限り使用せず、void sub_write(const char *a)などとしたほうが良いと思いますが...
- jacta
- ベストアンサー率26% (845/3158)
> ----------(main.h)---------- > char a[100]; これをmain.cppとsub.cppの二箇所からインクルードしているからです。 aの定義はどちらか一方で行い、main.hの中では外部宣言のみ(具体的にはexternをつける)にすれば、解決します。
- Dooon
- ベストアンサー率20% (36/180)
エラーメッセージの言っている通りです。 "main.h"の変数aは、main.cppで既に使われているためです。 sub.cppで再度変数aを使おうとしています。 関数subへ引数として変数aを渡せばよいような気がしますけれど。
お礼
皆様ありがとうございます。 私の考え方が少し違っていたみたいで使い方がおかしいようなので、新しく質問をさせていただきます。 また#4様のご指摘どおりvoid sabは誤りでした。