
こんにちは。
C言語のプログラミングをしているのですが、
multiple definition of '関数名'と出てしまいます。
・コンパイルするファイル
program1.c(main文)
program2.c(関数)
program3.c(関数)
すべてのソースファイルが、
header.hをincludeしています。
header.hではすべての関数のプロトタイプ宣言がされています。
program2.cに書いてある関数、test()はすべてのソースファイルで使用しています。
・cygwin上で実行したコマンド
gcc -Wall program1.c program2.c program3.c -o test
・エラーの文章
(パス省略)/ccst1v2u.o:program2.c:(.text+0x0): mult
iple definition of `_test'
(パス省略)/ccyUr2Ku.o:program1.c:(.text+0x0): first defi
ned here
このような事態に陥った場合の解決方法はどのようにすればよいでしょうか?
先輩から引き継いだ、もともと一つのソースファイルに書かれていた多数の関数を、利便性のために分割したところこのようなエラーが発生しました。
先輩から引き継いだもののため、本当の関数名など細かいことをこちらに書き込めないのですが、
出来る範囲で補足いたします。
どうかよろしくお願いいたします。
No.6ベストアンサー
- 回答日時:
実際にサンプルを作って確認してみましたか?
以下、インデントに全角スペースを使っています。
ソースを公開できないということなので、アドバイスできるのはここまでです。
=======
header.h
=======
#ifndef _HEADER_H_
#define _HEADER_H_
#include <stdio.h>
#include <stdlib.h>
void test1(void);
void test2(void);
void test3(void);
#endif
=====
main.c
=====
#include "header.h"
int main(void)
{
test1();
test2();
test3();
return 0;
}
=====
test1.c
=====
#include "header.h"
void test1(void)
{
printf("test1() called.\n");
}
=====
test2.c
=====
#include "header.h"
void test2(void)
{
test1();
printf("test2() called.\n");
}
=====
test3.c
=====
#include "header.h"
void test3(void)
{
test1();
test2();
printf("test3() called.\n");
}
お手数をおかけしてすみません。
自分で試せばすぐできることなのに頭が回りませんでした(汗)
ソースコードまでご丁寧に書いてくださりありがとうございました。
回答いただいたプログラムではエラーもなく正常に動作しました。
なので、今エラーが出ているプログラムは何か見落としているダメな箇所があるはずだとわかりました。
何度も見返したつもりですが、もう一度戻ってみてみることにします。
回答本当にありがとうございました。
No.5
- 回答日時:
>・エラーの文章
>(パス省略)/ccst1v2u.o:program2.c:(.text+0x0): multiple
> definition of `_test'
>(パス省略)/ccyUr2Ku.o:program1.c:(.text+0x0): first
> defined here
testがprogram2.cで多重定義されました、
testは既にprogram1.cで定義されています。
そのままですね。。。
シンボル'XXX'が多重定義されていることを意味します。
#4さんが書かれている通り、C++ではオーバロードと呼ばれる
機能を使って、同じ関数名(メソッド名)でも引数が違えば
複数定義することが可能です。しかし、C言語では同じシンボルを
もつ関数や変数は認められません。
回答ありがとうございます。
追加で質問させていただきたいのですが、
以下のような場合でソースファイルを分割したい場合どうすればいいのでしょうか?
・test.c
main():test1,2,3使用
test1()
test2():test1使用
test3():test1,2使用
のとき、
test.cを
・main.c:mainのみ
・test1.c:test1定義
・test2.c:test2定義
・test3.c:test3定義
の4枚に分割したい。
私はこのような場合に、header.hというtest1,2,3がプロトタイプ宣言されているヘッダーを作り、
すべての.cにインクルードするというやり方をとって失敗してしまったのです。
私の理解不足で申し訳ありませんが、
もしお時間がありましたら、回答いただけるとうれしいです。
No.4
- 回答日時:
#3です。
訂正。>C++だと、同じ関数名でも、引数リストが同じであれば
C++だと、同じ関数名でも、引数リストが異なれば
回答ありがとうございます。
どうやらC++にすると平気なようなのですが、
コンパイルしてみたところ、
C++では禁止(?)のnewという名前の変数を多用しているので、
エラーが出てしまいました。
ただ、問題としているエラーは出なかったので、
その変数名を直せば行けるのでは、、、と感じます。
C++を勉強したことが無いので不安ですが、
試してみたいと思います。
また、prpgram1と2で同じものを定義しているとのことですが、
1ではtest()については定義していません。
使用はしています。
2にtest()の中身が書いてあり、
プロトタイプ宣言をしているheader.hを両方のプログラムがインクルードしています。
もし勘違いがあればすみません。
No.3
- 回答日時:
見たまんまだと思うんだけど…。
program1.cとprogram2.cで、
同じ関数testを定義しているんじゃないでしょうか。
C++だと、同じ関数名でも、引数リストが同じであれば
多重定義が可能ですが、Cではできない(であってます?)と思います。
例えば、program1,2,3のファイル名の拡張子を
.cppにしてコンパイルしたらどうなるでしょうか?
No.2
- 回答日時:
program1.c、program2.c、program3.cそれぞれをリンクするときの組み合わせ(依存関係)が発生して、gcc が test() 関数を複数定義していると認識している気がします。
試しに1つづつ分割してコンパイルgcc -Wall -c -o program1.o program1.c
gcc -Wall -c -o program2.o program2.c
gcc -Wall -c -o program3.o program3.c
gcc -Wall -o test program1.o program2.o program3.o
するとどうなりますでしょうか。
※ 本来は Makefile で書いたほうが良いのですが。
回答ありがとうございます。
やってみましたが、同じエラー内容が出ました。。。
一つ一つのコンパイルは成功しましたが、
最後の合体でエラーが出てしまいました。。。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBAでfunctionを利用しようとしたときに「引数は省略できません」というエラーが出ます 1 2022/10/15 16:30
- その他(プログラミング・Web制作) python OpenPyXLを使って出力結果をエクセルに書き込み 2 2022/06/04 19:46
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- その他(プログラミング・Web制作) VScodeでpythonプログラムの関数を実行したい 2 2022/07/13 19:24
- Visual Basic(VBA) VBA★PDFをPDFアプリで印刷しようと思っていますが上手くゆきません 1 2022/06/06 22:04
- その他(Microsoft Office) 【スプレドシート】IMPORTRANGE関数とSUMIFSの組み合わせ 1 2023/03/05 18:17
- Windows 10 ネットワークプリンターにファイルを直接送る方法・コマンドないですか?(´・ω・`) 3 2023/03/13 23:15
- C言語・C++・C# c言語 配列とポインタについて 3 2023/02/09 22:53
- Outlook(アウトルック) outlookの送信エラーについて 1 2022/05/13 12:04
- C言語・C++・C# メインプログラムに#include <algorithm>を書いて、 そのメインプログラムが // 3 2023/05/02 11:24
このQ&Aを見た人はこんなQ&Aも見ています
-
multiple definitionというエラー
C言語・C++・C#
-
2重定義って??
C言語・C++・C#
-
C言語初心者の質問失礼します。
C言語・C++・C#
-
-
4
関数の実体定義にヘッダファイルの2重定義防止方法が効かない?
C言語・C++・C#
-
5
fopenで別ディレクトリにファイルをオープンしたい
C言語・C++・C#
-
6
構造体のメンバをfor文で回したい
C言語・C++・C#
-
7
C言語での引数の省略方法
C言語・C++・C#
-
8
コンパイルエラーについて
C言語・C++・C#
-
9
C言語でヘッダファイルにグローバル変数を宣言する
C言語・C++・C#
-
10
実行ファイルのパスを取得したい
C言語・C++・C#
-
11
エラーの意味は? Lvalue required
C言語・C++・C#
-
12
C言語のコンパイルエラー
C言語・C++・C#
-
13
<unistd.h>をVisualStudioでつかえるようにする
C言語・C++・C#
-
14
C言語のポインターに関する警告
C言語・C++・C#
-
15
HEWを使用しているのですが、このようなエラーが出ました。
C言語・C++・C#
-
16
構造体のextern方法
C言語・C++・C#
-
17
main.c:7:43: warning: implicit declaration of func
C言語・C++・C#
-
18
C言語 構造体の中に共用体を定義した変数の初期化に関して
C言語・C++・C#
-
19
メモリをアドレスを直接指定して値を取得するには
C言語・C++・C#
-
20
PCC-S-02201エラーの対処を教えてください!
Oracle
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Arduinoを使ってMIDI機器のコン...
-
VC++でGetKeyboardStateがうま...
-
既定のコンストラクタがありま...
-
プログラミング教えてください
-
OpenSSLのSHA1関連の関数はどこ...
-
const_castのつかいどころを教...
-
(void)0 はどんな意味ですか
-
リージョンのフレームを描画す...
-
gcc: incompatible pointer type
-
見た目は同じソースなのにエラ...
-
カノニカルモードの設定について
-
静的でないメンバ関数の呼び出...
-
C言語 ① 5秒間 1秒間隔で点滅を...
-
ソケット通信時のWSACleanup処...
-
GDI+の使用方法について
-
C++でイベントドリブンなコード...
-
C/C++でのScene管理について
-
「Aに対するBの割合」と「Aに対...
-
fgetsなどのときのstdinのバッ...
-
信頼区間の1.96や1.65ってどこ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
静的でないメンバ関数の呼び出...
-
【gcc・cygwin】multiple defin...
-
戻り値を返す関数の前に(void)...
-
多重定義が起きている?--lnk20...
-
C++にてtemplateで受け取った任...
-
const_castのつかいどころを教...
-
既定のコンストラクタがありま...
-
C# Controls.Addで動的に配置し...
-
(void)0 はどんな意味ですか
-
C#でラジオボタンを設定に記録...
-
ウインドウの移動禁止
-
Notepad++の関数リスト表示の変...
-
Delphiの定数とローカル変数の...
-
typedef unsigned int UINT;が...
-
int main()、void main()、void...
-
C言語 extern について
-
void*型の配列について
-
VC++でGetKeyboardStateがうま...
-
_beginthreadにて発生するコン...
-
gcc: incompatible pointer type
おすすめ情報