ページ 11

未解決の外部シンボルがあるというえらーがでます。

Posted: 2009年12月20日(日) 19:31
by むん
未解決の外部シンボルがあるというエラーがでます。
どうしてこのようなエラーがでるのかが知りたいです。
プログラムリストは以下のようになっています。
"ファイル名"としています。

"queue.h"
#include<stdio.h>
#include<stdlib.h>
#define MAX 256
typedef struct{
    char data[MAX];
    int head,tail,number;
}Queue;

void enqueue(Queue *Q,char x);
char dequeue(Queue *Q);
void initialize(Queue *Q);
int empty(Queue *Q);
"queue.c"
ではエンキューにデキューをする関数を行っています。

"main.c"
#include "queue.h"

int main(void)
{
    char x;
    Queue Q;
    initialize(&Q);
    enqueue(&Q,'a');
    enqueue(&Q,'b');
    enqueue(&Q,'c');
    x=dequeue(&Q);
    x=dequeue(&Q);
    enqueue(&Q,'d');
    x=dequeue(&Q);
    enqueue(&Q,'e');
    
    while(!empty(&Q)){
        printf("%c",dequeue(&Q));
    }
    printf("\n");
    return (0);
}
それではよろしくお願いします。

Re:未解決の外部シンボルがあるというえらーがでます。

Posted: 2009年12月20日(日) 19:37
by box
>"queue.c"
>ではエンキューにデキューをする関数を行っています。

せっかくですから、これの中身も見せてください。

「未解決の外部シンボル」というエラーは、
変数や関数の定義場所と使用場所とで名前が食い違っているとき
などに起きます。

Re:未解決の外部シンボルがあるというえらーがでます。

Posted: 2009年12月20日(日) 23:39
by むん
boxさんありがとうございます。

それと返信遅くなってすみません。

queue.c
の中身は以下のようになっています。
#include "queue.h"

void enqueue(Queue *Q,char x){
    if(Q->number < MAX){
        Q->number++;
        Q->tail=(Q->tail%MAX)+1;
        Q->data[Q->tai[/url]=x;
    }else{
        printf("Queue Q overflows.\n");
    }
}

char dequeue(Queue *Q){
    if(Q->number > 0){
        Q->number--;
        Q->head=(Q->head%MAX)+1;
        return(Q->data[Q->head]);
    }else{
        printf("Queue Q is empty .\n");
        return('\0');
    }
}

void initialize(Queue *Q){
    Q->head=0;
    Q->tail=0;
    Q->number=0;
}

int empty(Queue *Q){
    if(Q->number==0){
        return (1);
    }
    return (0);
}
それではお願いします。

Re:未解決の外部シンボルがあるというえらーがでます。

Posted: 2009年12月21日(月) 00:39
by トントン
「未解決の外部シンボル」はboxさんが述べている通りで。


何が未解決の外部シンボルなのかわからないです。
他にエラーメッセージがありませんでしたか?

Re:未解決の外部シンボルがあるというえらーがでます。

Posted: 2009年12月21日(月) 01:13
by むん
トントンさんありがとうございます。

Error: 外部シンボル '_initialize' が未解決
Error: 外部シンボル '_enqueue' が未解決
Error: 外部シンボル '_dequeue' が未解決
Error: 外部シンボル '_empty' が未解決

queue.cの関数全てが未解決とでます。
ちゃんとエラーメッセージを書かなくてすみません。

それではよろしくお願いします。

Re:未解決の外部シンボルがあるというえらーがでます。

Posted: 2009年12月21日(月) 09:12
by tk
パッと見ただけですが、
単純にqueue.cがプロジェクトに追加できていない
だけのような気がします。

開発環境教えていただけませんか?

Re:未解決の外部シンボルがあるというえらーがでます。

Posted: 2009年12月21日(月) 17:37
by むん
tkさんありがとうございます。

開発環境ですが、 Visual c++ 2008 のコマンドプロンプトでコンパイルをしています。
それと一応このプログラムは実行できて、deと出力されます。

Re:未解決の外部シンボルがあるというえらーがでます。

Posted: 2009年12月21日(月) 21:42
by トントン
>未解決の外部シンボルがあるというエラーがでます。
>どうしてこのようなエラーがでるのかが知りたいです。

でも、実行できている…。
現在は何が知りたい状態なのでしょうか?

Re:未解決の外部シンボルがあるというえらーがでます。

Posted: 2009年12月21日(月) 22:15
by box
>それと一応このプログラムは実行できて、deと出力されます。

ということは、過去のある時点では当該のエラーが出ていたものの、
現時点では解決済みであると判断できます。

Re:未解決の外部シンボルがあるというえらーがでます。

Posted: 2009年12月21日(月) 23:52
by むん
トントンさん、boxさんありがとうございます。

一番始めにもかきましたが、どうしてこの未解決であるという
エラーがでているのかが知りたいので質問させていただきました。

できればエラーをなくしたいと考えています。

わかりずらい質問ですいません。
もう一度説明させていただきますと、

Error: 外部シンボル '_initialize' が未解決
Error: 外部シンボル '_enqueue' が未解決
Error: 外部シンボル '_dequeue' が未解決
Error: 外部シンボル '_empty' が未解決

というエラーメッセージがでますが、一応Visul c++ 2008 のコマンドプロンプト上
では実行できました。ですがこのエラーをなくしたいと考えています。、
一体どうしたらよいのでしょうか?

それではよろしくお願いします。

Re:未解決の外部シンボルがあるというえらーがでます。

Posted: 2009年12月22日(火) 00:20
by Poco
状況が分からないので質問を二つ。

1.プログラムが動いているという「今」もエラーは出ますか?

2.ソリューション(もしくはプロジェクト)をクリーン後、
 再びプログラムをビルドして、プログラムを実行できますか?

Re:未解決の外部シンボルがあるというえらーがでます。

Posted: 2009年12月22日(火) 00:40
by softya
>開発環境ですが、 Visual c++ 2008 のコマンドプロンプトでコンパイルをしています。
コンパイル時のコマンドを教えてください。
コンパイルコマンドの書き方に問題がある気がします。

なぜ、実行しても問題ないかは謎ですが・・・。

Re:未解決の外部シンボルがあるというえらーがでます。

Posted: 2009年12月22日(火) 00:42
by むん
ぽこさんありがとうございます。

Visual c++ を使用していましたが、コマンドプロンプトのnotepadでcのファイルを作って
プログラミングしていたので、ソリューションなどは関係ないと思います。
基本的にメモ帳に書いていましたので。

それとすいません。PathをいじっていたらVisual c++2008 のコマンドプロンプト上でコンパイル
できなくなってしまいました。なので始めてのC言語というソフトで実行してみましたが、
まったく同じエラーが出ます。今度は実行もされませんでした。

すいません。少し状況を変えてしまって。それではよろしくお願いします。

Re:未解決の外部シンボルがあるというえらーがでます。

Posted: 2009年12月22日(火) 00:47
by むん
softyaさんありがとうございます。

cl queuemain.c queue.c でVisual c++ ではコンパイルしていました。

それと上記でも書きましたが、申し訳ありません。上記ではソフト名を間違えました。

C言語をはじめようというソフトでコンパイルをしています。
するとまったく同じエラーがでてしまいました。

違うファイルから関数を呼び出すとき、この方法では何かまずいのでしょうか?

Re:未解決の外部シンボルがあるというえらーがでます。

Posted: 2009年12月22日(火) 01:11
by Poco
> Visual c++ を使用していましたが、コマンドプロンプトのnotepadでcのファイルを作って
> プログラミングしていたので、ソリューションなどは関係ないと思います。

すみません、見落としていました。

VC++2008ExpressEdition提供のコマンドプロンプトから提示されたソースコードを
コンパイルしましたが、エラーメッセージが出てきません。

揚げ足を取るようで申し訳ありませんが、
×queuemain.c
○main.c
ですよね?

Re:未解決の外部シンボルがあるというえらーがでます。

Posted: 2009年12月22日(火) 02:24
by トントン
う~む、少し疑問というか自分が知らない面が出てきて面白いというか。

>未解決の外部シンボルがあるというエラーがでます
という時点で、コンパイルエラーですよね?
それとも、コンパイルはされてexeファイルは作成されたのでしょうか?


ちなみに、自分が今考えられる「未解決の外部シンボル」エラーの出し方としては

1.関数Hogeが入っているファイルを読み込んでいないが何処かでHogeを使用している場合
2.関数Fugaはプロトタイプ宣言のみ行っており中身はないが何処かでFugaを使用している場合

今回の場合だと、
queue.cを読み込んでいない可能性が考えられます。
が、実行できて結果が得られるというのは何でだろうという感じなので
自分としても詳細が知りたいです。

ちなみに、パスを変えてしまいわからなくなってしまったのであれば
再インストールしてみてはいかがでしょう?

Re:未解決の外部シンボルがあるというえらーがでます。

Posted: 2009年12月22日(火) 22:34
by last snow
私が考えられる内容としましては、この可能性が考えられます。

1.main関数で使用するqueue.cpp内の関数が、queue.hで使用宣言になっていないため。
解決案⇒queue.h関数宣言を削除し、main.cppのグローバル領域に頭にextern宣言を付けて宣言する。
例:
【queue.h】

#include<stdio.h>
#include<stdlib.h>
#define MAX 256
typedef struct{
char data[MAX];
int head,tail,number;
}Queue;

【main.c】

#include "queue.h"

extern void enqueue(Queue *Q,char x);
extern char dequeue(Queue *Q);
extern void initialize(Queue *Q);
extern int empty(Queue *Q);


int main(void)
{
~~~~~~~
以下、ソース続く


上記で直らない場合は、下記の

2.コマンドライン上でファイル名をmain.cppの後にqueue.cppを渡している。
解決案⇒queue.h、queue.cpp、main.cppの順にコンパイラに渡してみる。

使用した事がないので解りませんが、可能性としてはありえるかと。

コンパイラ再インストール後、上記2つで解決しない場合は、ちょっとわからないですね……。

上記で直った場合は、後で解説しますね~。

Re:未解決の外部シンボルがあるというえらーがでます。

Posted: 2009年12月22日(火) 22:57
by box
> >未解決の外部シンボルがあるというエラーがでます
> という時点で、コンパイルエラーですよね?

コンパイルエラーではありません。
コンパイルは通ったが、リンク時にエラーが出ているのです。


なお、リンクに失敗すると実行ファイルを生成しません。
よって、リンクに失敗したが実行できている、という状況は
ありえません。>質問者さん

Re:未解決の外部シンボルがあるというえらーがでます。

Posted: 2009年12月22日(火) 23:19
by トントン
>コンパイルエラーではありません。
>コンパイルは通ったが、リンク時にエラーが出ているのです。

なるほど!
試してみたら未解決の外部シンボルの場合、オブジェクトファイルは生成されました。

勘違いしてました。自分も勉強になります。

Re:未解決の外部シンボルがあるというえらーがでます。

Posted: 2009年12月24日(木) 09:18
by たいちう
>コンパイルは通ったが、リンク時にエラーが出ているのです。

以前のプログラムで正常にコンパイル・リンクされた実行ファイルを
実行しているのではないですか?
その後プログラムを変更したところ、リンクエラーが発生するようになったため、
古い実行ファイルが残っている、と。

自分が編集しているソースファイルが、ビルド(コンパイル + リンク)の対象とは限りませんし、
ビルドされて作成された実行ファイルが実行されているとは限りません。
たまにこのような勘違いが起こってしまいますので、次のように確認してみてください。
コンパイルエラーやリンクエラーが発生するならば、新しい文字列は表示されないはずです。
int main(void)
{
    printf("test\n");  // <-- 文字列を頻繁に変えてみよう
    ...