※ ChatGPTを利用し、要約された質問です(原文:エラーの原因が分かりません "undefined reference to")
エラーの原因が分かりません "undefined reference to"
2009/07/20 17:37
このQ&Aのポイント
ライブラリのヘッダファイル matrix.h には、行列の操作に関する関数が定義されています。行列の初期化や表示、行列の掛け算などが実装されています。
ライブラリのソースファイル matrix.c では、行列の操作に関する関数の具体的な処理が記述されています。zero_matrix関数では、行列の要素を全て0に初期化し、identity_matrix関数では、単位行列を作成します。
しかし、test_matrix.cをコンパイルすると、"undefined reference to '_transposed_matrix'"と、"undefined reference to '_multiply_matrix'"の2つのエラーメッセージが表示されます。これは、コンパイラが'_transposed_matrix'と'_multiply_matrix'の関数実装を見つけられなかったことを意味しています。
エラーの原因が分かりません "undefined reference to"
ライブラリのヘッダファイル matrix.h
#ifndef MATRIX_H
#define MATRIX_H
#ifdef __cplusplus
extern "C"{
#endif
typedef struct{ int row,col; double *elements; } MATRIX;
extern int matrix_error_code;
extern void zero_matrix(MATRIX *a);
extern void identity_matrix(MATRIX *a);
extern void show_matrix(MATRIX *x);
extern MATRIX multiply_matrix(MATRIX *a,MATRIX *b);
extern MATRIX transposed_matrix(MATRIX *a);
#ifdef __cplusplus
}
#endif
#endif
ライブラリのソースファイル matrix.c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "matrix.h"
int matrix_error_code = 0;
void zero_matrix(MATRIX *a)
{
int i,size;
double *p;
size=a->row*a->col;
if((p = malloc(sizeof(double)*size)) == NULL)
{
puts("メモリを確保できません.");
exit(0);
}
a->elements=p;
for(i=0;i<size;i++)
*p++=0;
}
void identity_matrix(MATRIX *a)
{
int i;
zero_matrix(a);
for(i=0;i<a->row;i++)
{
*(a->elements+i*a->col+i)=1.0000;
}
}
void show_matrix(MATRIX *x)
{
int i,j;
for(i=0;i<x->row;i++)
{
for(j=0;j<x->col;j++)
{
printf("%3.4lf ",*(x->elements+i*x->col+j));
}
printf("\n");
}
printf("\n");
}
MATRIX transposed_matrix(MATRIX *a)
{
MATRIX x;
int i,j;
double *p;
if((p = malloc(sizeof(double)*(a->row*a->col))) == NULL)
{
puts("メモリを確保できません.");
exit(0);
}
x.elements=p;
x.row=a->col;
x.col=a->row;
for(i=0;i<x.row;i++)
{
for(j=0;j<x.col;j++)
{
*p++=*(a->elements+j*x.row+i);
}
}
return x;
}
MATRIX multiply_matrix(MATRIX *a,MATRIX *b)
{
int i,j,k;
double *p;
MATRIX x;
x.row=a->row;
x.col=b->col;
if((p = malloc(sizeof(double)*(x.row*x.col))) == NULL)
{
puts("メモリを確保できません.");
exit(0);
}
x.elements=p;
for(i=0;i<x.row;i++)
{
for(j=0;j<x.col;j++)
{
for(k=0;k<a->col;k++)
{
*p += *(a->elements+i*a->col+k) * *(b->elements+k*b->row+j);
}
}
p++;
}
return x;
}
動作確認のアプリケーションファイル test_matrix.c
#include <stdio.h>
#include "matrix.h"
int main(void)
{
int i,j;
MATRIX b,c,d,f;
b.row=c.row=2;
b.col=c.col=2;
identity_matrix(&b);
identity_matrix(&c);
d=transposed_matrix(&b);
show_matrix(&d);
f=multiply_matrix(&b,&c);
show_matrix(&f);
return 0;
}
ライブラリのコンパイルまではエラーなしで出来るのですが、test_matrix.cをコンパイルすると、"undefined reference to '_transposed_matrix'"と、"undefined reference to '_multiply_matrix'"の2つが表示されてコンパイルができません。
どうかよろしくお願いします。
質問の原文を閉じる
質問の原文を表示する
お礼
指摘していただいた所を変更したら、コンパイルできました。 困っていたので本当にありがとうございました。