C言語のコンパイルエラーについて解決方法を教えてください

このQ&Aのポイント
  • C言語のコンパイラであるvisual C++を使用している場合、1つのソースファイルに複数の.cファイルを作成するとビルドエラーが発生することがあります。エラーメッセージには複数回定義されたシンボルが見つかったという内容が含まれます。
  • 一部の解決策として、プロジェクトのプロパティで生成コードの設定を変更する方法があります。具体的には、プロジェクトのプロパティ→C言語のプロパティ→生成コード→DLLといった手順で設定を変更することができます。しかし、これによって必ずしも問題が解決するわけではありません。
  • コンパイルエラーが解決しない場合は、ソースファイルの依存関係や宣言の重複などを確認する必要があります。また、ビルドログを確認することで詳細なエラー情報が得られる場合もあります。問題が解決しない場合は、コンパイラのバージョンや設定、ソースコード自体の修正などを検討する必要があります。
回答を見る
  • ベストアンサー

質問です

質問したいことがあるのですが C言語のコンパイラとしてvisual C++ を使っているのですが、1つのソースファイルの中に複数の.cファイルを作成すると 1>------ ビルド開始: プロジェクト: C言語, 構成: Debug Win32 ------ 1>コンパイルしています... 1>sample.c 1>c:\users\太郎\documents\visual studio 2008\projects\c言語\c言語\sample.c(105) : warning C4101: 's3' : ローカル変数は 1 度も使われていません。 1>c:\users\太郎\documents\visual studio 2008\projects\c言語\c言語\sample.c(105) : warning C4101: 's2' : ローカル変数は 1 度も使われていません。 1>リンクしています... 1>sample2.obj : error LNK2005: _main は既に sample.obj で定義されています。 1>C:\Users\太郎\Documents\Visual Studio 2008\Projects\C言語\Debug\C言語.exe : fatal error LNK1169: 1 つ以上の複数回定義されているシンボルが見つかりました。 1>ビルドログは "file://c:\Users\太郎\Documents\Visual Studio 2008\Projects\C言語\C言語\Debug\BuildLog.htm" に保存されました。 1>C言語 - エラー 2、警告 2 ========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ========== と表示されてうまく実行することができません。 一応私なりに調べて プロジェクト→C言語のプロパティ→生成コード→DLL で回避されると書いてあったんですがいくらその設定にしても何の問題も解決されません。 どうしたらいいですか?

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

  • ベストアンサー
  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.2

>1つの実行ファイル中にmain()は1つしか存在できません。 と書きましたが…main()だけとは限りませんので注意。 プロジェクトのソースが main.c/source1.c/source2.cとあって、 それぞれにfunc()という関数を定義した場合、衝突してリンクできなくなる場合があります。 # クラスに分けていて名前空間が衝突していないとかstaticでファイル内スコープに限定するとかであれば衝突しなくて済みますが…。 # そのあたりはもっと詳しい方からの回答に期待…。

その他の回答 (1)

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.1

1つの実行ファイル中にmain()は1つしか存在できません。 別々のプロジェクトを作成して、別々のexeファイルになるようにしてください。 よって… >プロジェクト→C言語のプロパティ→生成コード→DLL >で回避されると書いてあったんですがいくらその設定にしても何の問題も解決されません。 こんなのでは回避できません。 http://www.google.co.jp/search?hl=ja&num=30&q=%22error+LNK2005%3A+_main+%E3%81%AF%E6%97%A2%E3%81%AB%22&btnG=%E6%A4%9C%E7%B4%A2&lr=lang_ja 複数のソースファイルに分割して、分割コンパイルを行うのであればリンク時に >1>sample2.obj : error LNK2005: _main は既に sample.obj で定義されています。 なんてのは出ません。 # ソリューションの設定なども絡んだりするので…ソリューションごと新しく作る。という方が気楽かも知れません。 # スタートアッププロジェクトとか……。 分割コンパイルについてはこちら。 http://www.google.co.jp/search?hl=ja&num=30&q=%E5%88%86%E5%89%B2%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB+%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88&btnG=%E6%A4%9C%E7%B4%A2&lr=lang_ja

関連するQ&A

  • popen・pcloseについて

    popen・pcloseについて 以下のようにpopenを使ってdirコマンドを打った時と同じようなプログラムを Microsoft Visual C++ 2008上で作ったのですが #include <stdio.h> int main(void) { FILE *fp; char buff[64]; fp=popen("dir","r"); while(fgets(buff,sizeof(buff),fp)!=NULL){ printf("%s",buff); } pclose(fp); return 0; } これをビルドした所、以下のようなエラーが出てしまいました。 c:\users\yamaomoto\documents\visual studio 2008\projects\popen\popen\popen.c(8) : warning C4013: 関数 'popen' は定義されていません。int 型の値を返す外部関数と見なします。 c:\users\yamaomoto\documents\visual studio 2008\projects\popen\popen\popen.c(8) : warning C4047: '=' : 間接参照のレベルが 'FILE *' と 'int' で異なっています。 c:\users\yamaomoto\documents\visual studio 2008\projects\popen\popen\popen.c(14) : warning C4013: 関数 'pclose' は定義されていません。int 型の値を返す外部関数と見なします。 popen.obj : error LNK2019: 未解決の外部シンボル _pclose が関数 _main で参照されました。 popen.obj : error LNK2019: 未解決の外部シンボル _popen が関数 _main で参照されました。 C:\Users\Yamaomoto\Documents\Visual Studio 2008\Projects\popen\Debug\popen.exe : fatal error LNK1120: 外部参照 2 が未解決です。 色々と試してみたのですが解決に至りませんでしたのでよろしければ、 教えて頂けませんでしょうか?

  • 「bin」と「obj」のなかに「WindowsApplication1.exe」が作成される

    Documents\Visual Studio 2008\Projects\WindowsApplication1\WindowsApplication1\bin\Debug の中にも Documents\Visual Studio 2008\Projects\WindowsApplication1\WindowsApplication1\obj\Debug の中にも 先ほど作成した 「WindowsApplication1.exe」が入っているのですが どちらが本物でしょうか? (「bin」と「obj」のどちらのフォルダにも同じものがはいっている) どちらも更新日時は同じです。 なぜ2つできるのでしょうか? 起動するときはどちらを起動すればいいのでしょうか?

  • Visual Stdio.netでビルドができない

    Visual Stdio.netでプログラミングをはじめようと思ったのですが ビルドすると、何故かエラーになります。 以下がそのビルドログです。 何故かわかる方、ぜひ教えていただきたいです。 ちなみにプログラム自体は”Hello”と出力するだけの簡単なものです。 ------ ビルド開始 : プロジェクト : test, 構成 : Debug Win32 ------ リンクしています... LIBCD.lib(wincrt0.obj) : error LNK2019: 未解決の外部シンボル _WinMain@16 が関数 _WinMainCRTStartup で参照されました。 Debug/test.exe : fatal error LNK1120: 外部参照 1 が未解決です。 ビルドログは "file://c:\Documents and Settings\こに\My Documents\Visual Studio Projects\test\Debug\BuildLog.htm" に保存されました。 test - エラー 2、警告 0 ---------------------- 終了 ---------------------- ビルド : 0 正常終了、1 失敗、0 スキップ

  • C++でのエラーについて

    Microsoft Visual C++ 2010 Express において、以下のファイル (http://1st.geocities.jp/shift486909/program/Bernoulli/func.cpp) をコンパイルしようとすると、 1>------ ビルド開始: プロジェクト: eter, 構成: Debug Win32 ------ 1>LINK : error LNK2001: 外部シンボル "_WinMainCRTStartup" は未解決です。 1>c:\users\garnet\documents\visual studio 2010\Projects\eter\Debug\eter.exe : fatal error LNK1120: 外部参照 1 が未解決です。 ========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ========== というようなエラーが出てコンパイルできません。 何が原因なのでしょうか?

  • リンクの問題

    リンクしています... MSVCRTD.lib(crtexew.obj) : error LNK2019: 未解決の外部シンボル _WinMain@16 が関数 ___tmainCRTStartup で参照されました。 C:\Documents and Settings\hiro\My Documents\Visual Studio 2008\Projects\2maikyori\Debug\2maikyori.exe : fatal error LNK1120: 外部参照 1 が未解決です。  というerrorが出てくるのですが、どうすればリンクできるようになるのでしょうか?  ご教授お願いします。

  • C++ memory.dllサンプルが実行できない

    http://www.vector.co.jp/soft/win95/prog/se358509.html のmemory.dllを用いてプロセスメモリを弄るソフトを作ってみようと思い まず同梱されているサンプルをVisual Studio 2010 Professionalでコンパイルしてみようとしたのですが (サンプルの場所はダウンロードしたZIP内の\サンプル集\C言語\ のsample.cpp Memory.hです。) 1>sample.obj : error LNK2019: 未解決の外部シンボル _WriteMemory@16 が関数 "long __stdcall WndProc(struct HWND__ *,unsigned int,unsigned int,long)" (?WndProc@@YGJPAUHWND__@@IIJ@Z) で参照されました。 1>sample.obj : error LNK2019: 未解決の外部シンボル _ReadMemory@16 が関数 "long __stdcall WndProc(struct HWND__ *,unsigned int,unsigned int,long)" (?WndProc@@YGJPAUHWND__@@IIJ@Z) で参照されました。 1>C:\Users\hogehoge\Documents\Visual Studio 2010\Projects\testtesttest\Debug\testtesttest.exe : fatal error LNK1120: 外部参照 2 が未解決です。 と出力され、コンパイルされません。 何か問題があると思い、Google検索で色々調べたのですが分かりません・・・ 宜しければご助言を頂きたいです。お願い致します。

  • Visual C++のビルドにて

    Microsoft(C) Visual C++.NET 2003 std 上記のコンパイラを使用してあるプログラムをビルド しとようと したのですが以下のエラーがでてビルドできませんでした。 プログラム名:pro 名前:仮名 コンピュタ名:home 「pro fatal error LNK1201: プログラム データベース 'c:\Documents and Settings\田中 太郎.home\My Documents\Visual Studio Projects\bpro\Debug\pro.pdb' に書き込めません。ディスク容量不足、パスが無効、また十分な特権がない可能性があります。」 これの解決方法を知っている方、おしえてくださいましm(_)m

  • Visual Studioでのビルド

    Visual Stuido Express2012を使用しているのですがビルドについて質問があります。 DBViewerというプロジェクト名でC#のアプリを作成しているのですが ビルドしてできたexeファイルが下記の2通りの場所に存在しています。 exeファイルも両方動作します。 下のパスの方がフォルダの中身がスッキリしていてるのですがこの違いは 何なのでしょうか。また、リリースには下のパスのフォルダを使用するのが 正しいのでしょうか。 C:\Visual Studio 2012\Projects\DBViewer\DBViewer\obj\Debug C:\Visual Studio 2012\Projects\DBViewer\DBViewer\bin\Debug

  • MISTのLAPACKの環境設定ができない

    こんにちは.質問させていただきます. 画像の主成分分析を行いたいと思っており,調べたところMISTというライブラリを用いれば用意にできるそうなので,早速使ってみました. しかし行列演算を行うためのLAPACKというものがうまく環境設定できていないようで,大量のエラーが出て困っています. 手順は下のURLのpdfに従い行っておりました. http://mist.suenaga.cse.nagoya-u.ac.jp/pdf/MIST_no_susume.pdf 環境設定もこのpdfの19ページに従い行いました. 上記のpdfのとおりにサンプルプログラムを順番に動かしてみたら,画像の入出力などは正常にできました. が,17ページのサンプルプログラムを実行しようとすると,以下のようなエラーが大量に出てしまいます. ===================================================== 1>MSVCRT.lib(ftol2.obj) : error LNK2005: __ftol2 は既に libF77.lib(ftol2.obj) で定義されています。 1>LIBCMT.lib(crt0dat.obj) : error LNK2005: __initterm_e は既に MSVCRT.lib(MSVCR100.dll) で定義されています。 1>LIBCMT.lib(crt0dat.obj) : error LNK2005: _exit は既に MSVCRT.lib(MSVCR100.dll) で定義されています。 (中略) 1>LIBCMT.lib(errmode.obj) : error LNK2005: ___set_app_type は既に MSVCRT.lib(MSVCR100.dll) で定義されています。 1>LINK : warning LNK4098: defaultlib 'MSVCRT' は他のライブラリの使用と競合しています。/NODEFAULTLIB:library を使用してください。 1>LINK : warning LNK4098: defaultlib 'LIBCMT' は他のライブラリの使用と競合しています。/NODEFAULTLIB:library を使用してください。 1>C:\Documents and Settings\(ユーザ名)\My Documents\Visual Studio 2010\Projects\test\Debug\test2.exe : fatal error LNK1169: 1 つ以上の複数回定義されているシンボルが見つかりました。 ===================================================== 使用環境はWindows XP,Visual Studio2010です. プログラミングは初心者です. .NETというものがよくわからないので,Visual Studioを使っているのですが,これが問題でしょうか?Visual Studioではできないのでしょうか?(画像の入出力などは正常に処理できたので,LAPACKの設定がうまくできていないだけだと自分では思っているのですが・・・) どなたか詳しい方がいらっしゃいましたら,教えてください. よろしくお願いいたします.

  • Microsoft visual C++ Express Edtionでビルドできない

    Microsoft visual C++ Express Edtionを使っていますが、次のプログラムをビルドして、実行ファイルを使おうとすると次のエラーがでます。何処が違っているでしょうか? /* 整数値との和を表示する */ #include <stdio.h> int main(void) { printf("%d", 15 + 37); return (0); } ------ ビルド開始: プロジェクト: test2, 構成: Debug Win32 ------ リンクしています... LINK : fatal error LNK1104: ファイル'.\Debug\stdafx.obj' を開くことができません。 ビルドログは"file://d:\MYDOCUMENTS\Visual Studio 2005\Projects\test2\test2\Debug\BuildLog.htm" に保存されました。 test2 - エラー1、警告0 ========== ビルド: 0 正常終了、失敗、更新、スキップ==========