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

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

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

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

コンパイルエラー

コンパイルのフェーズで生成されるエラーです。よく無効なシンタックスやタイプが含まれているとき発生します。

Q&A

解決済

2回答

3234閲覧

コンパイルエラーを解消したい

退会済みユーザー

退会済みユーザー

総合スコア0

C

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

コンパイルエラー

コンパイルのフェーズで生成されるエラーです。よく無効なシンタックスやタイプが含まれているとき発生します。

0グッド

0クリップ

投稿2020/08/12 08:53

前提・実現したいこと

C言語を学習している初心者です。
スタックを利用するプログラムmain.c(「該当のソースコード」に掲載)を作成しました。
作成環境はVisual Studio Codeです。
このプログラムは市販参考書に掲載されているものなので間違いはないと思います。
しかし、次のようにコンパイルするとエラーメッセージ(「ターミナル画面」に掲載)が出てしまいます。
何が原因で、どうすれば実行できるのか教えて頂きたいです。
また、自作ヘッダファイルにおいて、IntStack.hとIntStack.cのコンパイルの順番はあるのでしょうか。
宜しくお願い致します。

ターミナル画面

※以下、パソコンのユーザー名を隠すため、ユーザー名の部分を***に置き換えました。

PS C:\Users***\Documents\program1> gcc .\IntStack.h PS C:\Users***\Documents\program1> gcc .\IntStack.c 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 PS C:\Users***\Documents\program1> gcc .\main.c c:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe: C:\Users***\AppData\Local\Temp\ccu9eV2g.o:main.c:(.text+0x1f): undefined reference to `Initialize' c:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe: C:\Users***\AppData\Local\Temp\ccu9eV2g.o:main.c:(.text+0x46): undefined reference to `Capacity' c:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe: C:\Users***\AppData\Local\Temp\ccu9eV2g.o:main.c:(.text+0x54): undefined reference to `Size' c:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe: C:\Users***\AppData\Local\Temp\ccu9eV2g.o:main.c:(.text+0x9c): undefined reference to `Terminate' c:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe: C:\Users***\AppData\Local\Temp\ccu9eV2g.o:main.c:(.text+0xec): undefined reference to `Push' c:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe: C:\Users***\AppData\Local\Temp\ccu9eV2g.o:main.c:(.text+0x11a): undefined reference to `Pop' c:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe: C:\Users***\AppData\Local\Temp\ccu9eV2g.o:main.c:(.text+0x15d): undefined reference to `Peek' c:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe: C:\Users***\AppData\Local\Temp\ccu9eV2g.o:main.c:(.text+0x198): undefined reference to `Print' c:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe: C:\Users***\AppData\Local\Temp\ccu9eV2g.o:main.c:(.text+0x1d1): undefined reference to `Search' c:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe: C:\Users***\AppData\Local\Temp\ccu9eV2g.o:main.c:(.text+0x203): undefined reference to `Search' c:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe: C:\Users***\AppData\Local\Temp\ccu9eV2g.o:main.c:(.text+0x221): undefined reference to `IsEmpty' c:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe: C:\Users***\AppData\Local\Temp\ccu9eV2g.o:main.c:(.text+0x24e): undefined reference to `IsFull' collect2.exe: error: ld returned 1 exit status

該当のソースコード

C

1/*IntStack.h*/ 2#ifndef ___IntStack 3#define ___IntStack 4 5typedef struct{ 6 int max; 7 int ptr; 8 int *stk; 9}IntStack; 10 11int Initialize(IntStack *s, int max); 12int Push(IntStack *s, int x); 13int Pop(IntStack *s, int *x); 14int Peek(const IntStack *s, int *x); 15void Clear(IntStack *s); 16int Capacity(const IntStack *s); 17int Size(const IntStack *s); 18int IsEmpty(const IntStack *s); 19int IsFull(const IntStack *s); 20int Search(const IntStack *s, int x); 21void Print(const IntStack *s); 22void Terminate(IntStack *s); 23 24#endif 25 26 27/*IntStack.c*/ 28#include <stdio.h> 29#include <stdlib.h> 30#include "IntStack.h" 31 32int Initialize(IntStack *s, int max){ 33 s->ptr = 0; 34 s->stk = calloc(max, sizeof(int)); 35 if(s->stk == NULL){ 36 s->max = 0; 37 return -1; 38 } 39 s->max = max; 40 return 0; 41} 42 43int Push(IntStack *s, int x){ 44 if(s->ptr >= s->max) return -1; 45 s->stk[s->ptr++] = x; 46 return 0; 47} 48 49int Pop(IntStack *s, int *x){ 50 if(s->ptr <= 0) return -1; 51 *x = s->stk[--s->ptr]; 52 return 0; 53} 54 55int Peek(const IntStack *s, int *x){ 56 if(s->ptr <= 0) return -1; 57 *x = s->stk[s->ptr - 1]; 58 return 0; 59} 60 61void Clear(IntStack *s){ 62 s->ptr = 0; 63} 64 65int Capacity(const IntStack *s){ 66 return s->max; 67} 68 69int Size(const IntStack *s){ 70 return s->ptr; 71} 72 73int IsEmpty(const IntStack *s){ 74 return s->ptr <= 0; 75} 76 77int IsFull(const IntStack *s){ 78 return s->ptr >= s->max; 79} 80 81int Search(const IntStack *s, int x){ 82 int i; 83 for(i=s->ptr-1; i>=0; i--){ 84 if(s->stk[i] == x) return i; 85 } 86 return -1; 87} 88 89void Print(const IntStack *s){ 90 int i; 91 for(i=0; i<s->ptr; i++){ 92 printf("%d ", s->stk[i]); 93 } 94} 95 96void Terminate(IntStack *s){ 97 if(s->stk != NULL) free(s->stk); 98 s->ptr = 0; 99 s->max = 0; 100} 101 102 103/*main.c*/ 104#include <stdio.h> 105#include "IntStack.h" 106 107int main(){ 108 IntStack s; 109 if(Initialize(&s, 64) == -1){ 110 printf("creating stack: failure"); 111 return 1; 112 } 113 while(1){ 114 int menu, x; 115 printf("amount of data:%d / %d\n", Size(&s), Capacity(&s)); 116 printf("1.push 2.pop 3.peek 4.print 5.search 6.empty? 7.full? 0.end:"); 117 scanf("%d", &menu); 118 if(menu == 0) break; 119 switch(menu){ 120 case 1: 121 printf("input data:"); 122 scanf("%d", &x); 123 if(Push(&s, x) == -1) printf("\apush failure\n"); 124 break; 125 case 2: 126 if(Pop(&s, &x) == -1) printf("\apop failure\n"); 127 else printf("popped data: %d\n", x); 128 break; 129 case 3: 130 if(Peek(&s, &x) == -1) printf("\apeek failure\n"); 131 else printf("peeked data: %d\n", x); 132 break; 133 case 4: 134 Print(&s); 135 break; 136 case 5: 137 printf("What number do you want to search? : "); 138 scanf("%d", &x); 139 if(Search(&s, x) == -1) printf("\a%d doesn't exist.\n", x); 140 else printf("%d is at stack[%d]\n", Search(&s, x)); 141 break; 142 case 6: 143 IsEmpty(&s) == 1 ? printf("The stack is empty.\n") : printf("The stack is not empty.\n"); 144 break; 145 case 7: 146 IsFull(&s) == 1 ? printf("The stack is full.\n") : printf("The stack is not full.\n"); 147 break; 148 } 149 } 150 Terminate(&s); 151 return 0; 152} 153

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

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

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

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

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

guest

回答2

0

ベストアンサー

コンパイル方法の間違いでは?

gcc .\IntStack.c
gcc .\main.c

ではなく、
gcc .\main.c .\IntStack.c でコンパイルできませんか?

あるいは、
gcc .\IntStack.c -o として、gcc .\main.c IntStack.o だったか? (最近、gcc 使ってないので自信無い)


gcc .\main.c とすると、.\main.c のファイルをコンパイル/リンクします。しかし、IntStack.cで定義される関数等の定義が無いため、未定義エラーとなります。 最初の方法は、二つの cソースをまとめて、コンパイル/リンクします。
コンパイル : ソース(.c)から、オブジェクトファイル(.o 等)を作成します。
リンク: 複数のオブジェクトファイルから、実行ファイル(Windowsだと、*.exe)を作成します。

投稿2020/08/12 09:04

編集2020/08/12 09:12
pepperleaf

総合スコア6385

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

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

退会済みユーザー

退会済みユーザー

2020/08/12 09:09

ご回答有り難うございます。 このコンパイル方法で出来ました。 この種類のコンパイル方法を知らなかったので、勉強になりました。 本当に有り難うございました。
guest

0

その外部参照の関数が見つからない、というエラーです。
それらの関数のソースファイルがリンクされてないようです。

どういうコマンドでビルドさせてるのでしょうか。


gcc ./main.c ./IntStack.c

のコマンドでビルドしてみましょう

投稿2020/08/12 09:03

編集2020/08/12 09:05
y_waiwai

総合スコア88042

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

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

退会済みユーザー

退会済みユーザー

2020/08/12 09:06

ご回答有り難うございます。 「どういうコマンドでビルドさせているか」とは、どういうことでしょうか。 知識不足ですみません。
y_waiwai

2020/08/12 09:08

コマンドプロンプトでどういうコマンドを打ち込んでビルドさせようとしてるのか、ってことです。 エラーメッセージの欄にコマンドがあったので追記しました。
退会済みユーザー

退会済みユーザー

2020/08/12 09:15

有り難うございます。 この方法でコンパイル出来ました。 重ねて質問で申し訳ないのですが、普通のコンパイルではバックスラッシュを使うところ(pepperleafさんの方法)を、スラッシュにしてもコンパイル出来ました(y_waiwaiさんの方法)。 これはどちらが一般的なのでしょうか?
y_waiwai

2020/08/12 09:20

ディレクトリの区切り文字のはなしですが、Windowsではスラッシュ、バックスラッシュどちらも使用できます Linuxの環境になると、バックスラッシュは使えなくなりますんで、そこらへん注意がいりますね
cateye

2020/08/12 09:22

〉一般的なのでしょうか? ¥はWindows環境だけです。 LinuxやmacOS、その他のUNIX系は/ですね。
pepperleaf

2020/08/12 09:25

カレントディレクトリのファイル指定だったら、'./'の指定は不要の筈。質問に合わせて、'.\'を入れましたが、、。 ただし、プログラムの実行では、、必要な場合も(Linux で、パスに '.'が無い場合)
退会済みユーザー

退会済みユーザー

2020/08/12 09:38

なるほど、実行環境によって異なるのですね。 皆さん丁寧に教えて下さり有り難うございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問