こんにちは。
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.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 で書いたほうが良いのですが。
回答ありがとうございます。
やってみましたが、同じエラー内容が出ました。。。
一つ一つのコンパイルは成功しましたが、
最後の合体でエラーが出てしまいました。。。
No.3
- 回答日時:
見たまんまだと思うんだけど…。
program1.cとprogram2.cで、
同じ関数testを定義しているんじゃないでしょうか。
C++だと、同じ関数名でも、引数リストが同じであれば
多重定義が可能ですが、Cではできない(であってます?)と思います。
例えば、program1,2,3のファイル名の拡張子を
.cppにしてコンパイルしたらどうなるでしょうか?
No.4
- 回答日時:
#3です。
訂正。>C++だと、同じ関数名でも、引数リストが同じであれば
C++だと、同じ関数名でも、引数リストが異なれば
回答ありがとうございます。
どうやらC++にすると平気なようなのですが、
コンパイルしてみたところ、
C++では禁止(?)のnewという名前の変数を多用しているので、
エラーが出てしまいました。
ただ、問題としているエラーは出なかったので、
その変数名を直せば行けるのでは、、、と感じます。
C++を勉強したことが無いので不安ですが、
試してみたいと思います。
また、prpgram1と2で同じものを定義しているとのことですが、
1ではtest()については定義していません。
使用はしています。
2にtest()の中身が書いてあり、
プロトタイプ宣言をしているheader.hを両方のプログラムがインクルードしています。
もし勘違いがあればすみません。
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.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");
}
お手数をおかけしてすみません。
自分で試せばすぐできることなのに頭が回りませんでした(汗)
ソースコードまでご丁寧に書いてくださりありがとうございました。
回答いただいたプログラムではエラーもなく正常に動作しました。
なので、今エラーが出ているプログラムは何か見落としているダメな箇所があるはずだとわかりました。
何度も見返したつもりですが、もう一度戻ってみてみることにします。
回答本当にありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
あなたが普段思っている「これまだ誰も言ってなかったけど共感されるだろうな」というあるあるを教えてください
-
映画のエンドロール観る派?観ない派?
映画が終わった後、すぐに席を立って帰る方もちらほら見かけます。皆さんはエンドロールの最後まで観ていきますか?
-
海外旅行から帰ってきたら、まず何を食べる?
帰国して1番食べたくなるもの、食べたくなるだろうなと思うもの、皆さんはありますか?
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
multiple definitionというエラー
C言語・C++・C#
-
HEWを使用しているのですが、このようなエラーが出ました。
C言語・C++・C#
-
関数の実体定義にヘッダファイルの2重定義防止方法が効かない?
C言語・C++・C#
-
-
4
構造体のデータを丸ごとコピーしたい
C言語・C++・C#
-
5
構造体のメンバをfor文で回したい
C言語・C++・C#
-
6
C言語のポインターに関する警告
C言語・C++・C#
-
7
C言語初心者の質問失礼します。
C言語・C++・C#
-
8
C言語 構造体の中に共用体を定義した変数の初期化に関して
C言語・C++・C#
-
9
<unistd.h>をVisualStudioでつかえるようにする
C言語・C++・C#
-
10
C言語での引数の省略方法
C言語・C++・C#
-
11
define で 配列
C言語・C++・C#
-
12
エラーの意味は? Lvalue required
C言語・C++・C#
-
13
0xffffとは?
C言語・C++・C#
-
14
構造体のextern方法
C言語・C++・C#
-
15
C言語でヘッダファイルにグローバル変数を宣言する
C言語・C++・C#
-
16
戻り値を返す関数の前に(void)を付ける
C言語・C++・C#
-
17
C言語にて構造体のメンバがNULLであるかを判定するサンプルを作成して
C言語・C++・C#
-
18
2重定義って??
C言語・C++・C#
-
19
ファイルから読み取った改行文字を消す方法
C言語・C++・C#
-
20
C言語のポインタに直接アドレスを割り振りしたい
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【gcc・cygwin】multiple defin...
-
静的でないメンバ関数の呼び出...
-
【VC++6.0】イベントハンドラ関...
-
既定のコンストラクタがありま...
-
戻り値を返す関数の前に(void)...
-
PICのプログラミングについて
-
int main()、void main()、void...
-
C++にてtemplateで受け取った任...
-
C++でオーバーロードに関するバ...
-
const_castのつかいどころを教...
-
Objective-Cで、スレッドを作成...
-
C# Controls.Addで動的に配置し...
-
多重定義が起きている?--lnk20...
-
VC++でGetKeyboardStateがうま...
-
pictureboxの画像を削除するには?
-
質問が多いです・・・・
-
LCDモニターの駆動
-
LNK2019:未解決の外部シンボル ...
-
カノニカルモードの設定について
-
関数ポインタについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【gcc・cygwin】multiple defin...
-
C++にてtemplateで受け取った任...
-
戻り値を返す関数の前に(void)...
-
静的でないメンバ関数の呼び出...
-
多重定義が起きている?--lnk20...
-
既定のコンストラクタがありま...
-
C# Controls.Addで動的に配置し...
-
int main()、void main()、void...
-
void*型の配列について
-
(void)0 はどんな意味ですか
-
gcc: incompatible pointer type
-
C# KeyDownイベントでショート...
-
C言語 ① 5秒間 1秒間隔で点滅を...
-
Notepad++の関数リスト表示の変...
-
コールバックって・・・
-
マルチメディアタイマーの使用方法
-
_beginthreadにて発生するコン...
-
C#でラジオボタンを設定に記録...
-
VC++でGetKeyboardStateがうま...
-
typedef unsigned int UINT;が...
おすすめ情報