0

ヘッダーrandomc.hで宣言されたクラスCRandomMersenneの関数を使用するプロジェクトがあります。関数は別のファイルmersenne.cppで定義されています。私のメイクファイルには、クラスの関数を使用するオブジェクト *MC_funcs2.o* があります。ソース *MC_funcs2.cpp* には、ヘッダーrandomc.hが含まれています。ただし、コンパイラは不平を言います:

MC_funcs2.o:MC_funcs2.cpp:(.text+0x20): `CRandomMersenne::Random()' への未定義の参照

前述の関数を使用するためのヘッダー ファイルや、makefile でのリンクなど、クラス定義の外で関数を宣言する際に何か問題があることを理解しています。一部のファイルの簡略版を次に示します。

メイクファイル:

SpMC3: SpMC3.cpp SpMC.h mersenne.o MC_funcs2.o
     g++ SpMC3.cpp MC_funcs2.o mersenne.o -o SpMC3

MC_funcs2.o: MC_funcs2.cpp SpMC.h randomc.h
     g++ -c MC_funcs2.cpp mersenne.cpp

mersenne.o: mersenne.cpp randomc.h userintf.cpp
     g++ -c mersenne.cpp userintf.cpp

SpMC3.cpp (メイン プログラム):

#include "SpMC.h"

int main() {
     cout << "boing" << endl;
     return 0;
}

MCfuncs2.cpp (コンパイルされないもの):

#include "SpMC.h"
#include "randomc.h"

CRandomMersenne RanGen(time(0));

void outrandom() {
     ofstream out;
     out << RanGen.Random() << endl;
     return;
}

何か案は?

4

2 に答える 2

1

個々のソース ファイル*.cをオブジェクト ファイルに*.oコンパイルすることを強くお勧めします。mersenne.cpp -> mersenne.o. これは、各オブジェクト ファイルを手動で指定することなく実現できます。

CC = gcc
CFLAGS = -g -O2
OBJECTS = main.o foo.o

main : $(OBJECTS)
    $(CC) $(CFLAGS) $(OBJECTS) -o main

%.o : %.c
    $(CC) $(CFLAGS) -c $<

Makefile の詳細については、このチュートリアルまたはHow to make a SIMPLE C++ Makefile? の優れた SO 回答をご覧ください。.

于 2013-01-27T16:52:47.880 に答える
1

このエラーは、mersenne.cpp がコンパイルされていないことを意味するだけです...コンパイルおよびリンクされていることを確認してください...

于 2013-01-27T17:12:58.643 に答える