ページ 11

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

Posted: 2013年6月27日(木) 17:35
by 黒船
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"
長いので省略

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

Posted: 2013年6月27日(木) 18:47
by softya(ソフト屋)
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"
長いので省略

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

Posted: 2013年6月27日(木) 20:05
by こじこじ
ふと、疑問に思ったのですが、
MT.hの9行目

MT(){mti=624+1;}

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

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

Posted: 2013年6月28日(金) 16:02
by 黒船
>こじこじさん
普通に関数の宣言をしているだけなので
これで大丈夫だと思います。
>softyaさん
修正しました。今度からプレビューします。

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

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

Posted: 2013年6月28日(金) 17:15
by h2so5
MTのソースコードもコンパイルしてリンクしないとダメです。

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

Posted: 2013年6月30日(日) 07:50
by 黒船
コンパイル方法に問題があったようです。
g++ main.cpp MT.cpp でコンパイルできました。
皆様ありがとうございます。