g++でコンパイルしようとしても「定義されていない参照です」と出てしまう。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
黒船
記事: 29
登録日時: 11年前
住所: 東京都目黒あたり

g++でコンパイルしようとしても「定義されていない参照です」と出てしまう。

#1

投稿記事 by 黒船 » 10年前

linuxでg++を使ってコンパイルしようとしても
/tmp/cc5Xy0bX.o: 関数 `main' 内:
main.cpp:(.text+0x35): `MT::init_genrand(unsigned long)' に対する定義されていない参照です
main.cpp:(.text+0x50): `MT::genrand_int32()' に対する定義されていない参照です
collect2: エラー: ld はステータス 1 で終了しました
と出てしまいます。
以下がソースコードです。

コード:

/*main.cpp*/
#include <stdio.h>
#include <time.h>
#include "MT.h"

int main(){
	MT mt_test;
	mt_test.init_genrand((unsigned long)time(NULL));
	for(unsigned int i=0;i<100;i++){
		printf("%ld\n",mt_test.genrand_int32());
	}
	return 0;
}

コード:

/*MT.h*/
class MT
{
	private:
	unsigned long mt[624]; /* the array for the state vector  */
	int mti; /* mti==624+1 means mt[624] is not initialized */

	public:
	MT(){mti=624+1;}
	void init_genrand(unsigned long s);
	void init_by_array(unsigned long init_key[], int key_length);
	unsigned long genrand_int32(void);
	long genrand_int31(void);
	double genrand_real1(void);
	double genrand_real2(void);
	double genrand_real3(void);
	double genrand_res53(void);
};

コード:

/*MT.cpp*/
#include "MT.h"
長いので省略
最後に編集したユーザー 黒船 on 2013年6月28日(金) 15:55 [ 編集 1 回目 ]

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: g++でコンパイルしようとしても「定義されていない参照です」と出てしまう。

#2

投稿記事 by softya(ソフト屋) » 10年前

codeタグを失敗されております。かならずプレビューしてください。
これ、リンケージエディタのエラーですが、どうやってコンパイルしてますか?
黒船 さんが書きました:linuxでg++を使ってコンパイルしようとしても
/tmp/cc5Xy0bX.o: 関数 `main' 内:
main.cpp:(.text+0x35): `MT::init_genrand(unsigned long)' に対する定義されていない参照です
main.cpp:(.text+0x50): `MT::genrand_int32()' に対する定義されていない参照です
collect2: エラー: ld はステータス 1 で終了しました
と出てしまいます。
以下がソースコードです。

コード:

/*main.cpp*/
#include <stdio.h>
#include <time.h>
#include "MT.h"

int main(){
	MT mt_test;
	mt_test.init_genrand((unsigned long)time(NULL));
	for(unsigned int i=0;i<100;i++){
		printf("%ld\n",mt_test.genrand_int32());
	}
	return 0;
}

コード:

/*MT.h*/
class MT
{
	private:
	unsigned long mt[624]; /* the array for the state vector  */
	int mti; /* mti==624+1 means mt[624] is not initialized */

	public:
	MT(){mti=624+1;}
	void init_genrand(unsigned long s);
	void init_by_array(unsigned long init_key[], int key_length);
	unsigned long genrand_int32(void);
	long genrand_int31(void);
	double genrand_real1(void);
	double genrand_real2(void);
	double genrand_real3(void);
	double genrand_res53(void);
};

コード:

/*MT.cpp*/
#include "MT.h"
長いので省略
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
こじこじ
記事: 16
登録日時: 11年前
住所: 札幌

Re: g++でコンパイルしようとしても「定義されていない参照です」と出てしまう。

#3

投稿記事 by こじこじ » 10年前

ふと、疑問に思ったのですが、
MT.hの9行目

MT(){mti=624+1;}

一番後ろに
;って付かないんですか?

アバター
黒船
記事: 29
登録日時: 11年前
住所: 東京都目黒あたり

Re: g++でコンパイルしようとしても「定義されていない参照です」と出てしまう。

#4

投稿記事 by 黒船 » 10年前

>こじこじさん
普通に関数の宣言をしているだけなので
これで大丈夫だと思います。
>softyaさん
修正しました。今度からプレビューします。

コンパイルの方法ですが
g++ main.cpp
と打ってコンパイルしています。

アバター
h2so5
副管理人
記事: 2212
登録日時: 13年前
住所: 東京
連絡を取る:

Re: g++でコンパイルしようとしても「定義されていない参照です」と出てしまう。

#5

投稿記事 by h2so5 » 10年前

MTのソースコードもコンパイルしてリンクしないとダメです。

アバター
黒船
記事: 29
登録日時: 11年前
住所: 東京都目黒あたり

Re: g++でコンパイルしようとしても「定義されていない参照です」と出てしまう。

#6

投稿記事 by 黒船 » 10年前

コンパイル方法に問題があったようです。
g++ main.cpp MT.cpp でコンパイルできました。
皆様ありがとうございます。

閉鎖

“C言語何でも質問掲示板” へ戻る