質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

2回答

2102閲覧

分割コンパイルができません

JohnTakahashi

総合スコア4

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2020/05/04 03:48

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
複数のファイルのコンパイルができません。
vs codeを使っています。

発生している問題・エラーメッセージ

ヘッダファイルをソースファイル内でincludeしたのですがうまくいきません。
gccでコンパイルするとこんなメッセージがでます。

c:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe: c:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../libmingw32.a(main.o):(.text.startup+0xc0): undefined reference to `WinMain@16' collect2.exe: error: ld returned 1 exit status

該当のソースコード

[sum.c] #include "sum.h" void InputPeople(People *data) { printf("name:"); scanf("%s",data->name); printf("age:"); scanf("%d",&data->age); printf("sex:"); scanf("%d",data->sex); printf("\n"); } void ShowPeople(People data) { char sex[16]; printf("name:%s\n",data.name); printf("age:%d\n",data.age); if(data.sex == 1){ strcpy(sex,"man"); } else { strcpy(sex,"woman"); } printf("sex:%s",sex); printf("\n"); } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [sum.h] #ifndef __PEOPLE_H__ #define __PEOPLE_H__ #include<stdio.h> #include<string.h> typedef struct{ char name[256]; int age; int sex; } People; extern void InputPeople(People *data); extern void ShowPeople(People data); #endif

試したこと

ヘッダファイルをsum.hとして他に記入しています
gcc sum.cとしてコンパイルしました。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cateye

2020/05/04 04:22

error: ld returned 1 exit status・・・は、リンクエラーです。main()は何処に有りますか?
JohnTakahashi

2020/05/04 04:24

参考書の通りにやってみました やっぱりmainがないと実行はできないのでしょうか?
cateye

2020/05/04 04:30 編集

C(C++も)かならずmain()から実行が開始されます。従って、main()を作って、各関数を呼び出すようにしましょう。・・・main()でも、#include "sum.h"を忘れないようにd^^
JohnTakahashi

2020/05/04 06:37

サイトを教えてくださりありがとうございます
guest

回答2

0

ベストアンサー

mainが無いからですね。

分割コンパイルで、メインプログラムとリンクしないなら、
gcc -c sum.c
です。
これでsum.oが出来るので、他のモジュールと合わせてリンクします。

投稿2020/05/04 04:01

otn

総合スコア84499

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

JohnTakahashi

2020/05/04 04:26

sum.oまではできました。 mainがあれば ./sum.oで実行できますか?
otn

2020/05/04 04:42

sum.oは実行できません。 sum.c にmainがあれば、gcc -o sum sun.c で出来たsum.exeを実行します。 タイトルからして、分割コンパイルをしたいのかと思ったのですが違うのでしょうか? mainの無い sum.c があり、mainのある sum-main.c があるとすると、 gcc -c sum.c gcc -c sum-main.c gcc -o sum-main sum-main.o sum.o とするのが分割コンパイルです。
JohnTakahashi

2020/05/04 06:37

ありがとうございます 漸く理解出来ました
guest

0

エラーメッセージは、WinMainという名前の関数がないと怒ってらっしゃいます

んで、分割コンパイルということは複数のソースファイルをコンパイルしたいってことでしょうか。
それなら、
0. 複数のソースファイルをコンパイルして複数のオブジェクトファイルを作る
0. そのオブジェクトファイル群をリンクして、実行ファイルを作る

という手順となります

gcc sum.c

では直接実行ファイルを作る、ってことになりますんで、まずはオブジェクトファイルを作るように

gcc -c sum.c

としましょう

投稿2020/05/04 03:56

y_waiwai

総合スコア87747

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問