0

我有一个项目使用 CRandomMersenne 类中的函数,在标头randomc.h中声明;这些函数在不同的文件mersenne.cpp中定义。在我的 makefile 中,我有一个使用类函数的对象 *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,即 i.ex。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 的更多信息,请查看本教程或如何制作简单的 C++ Makefile中的优秀 SO 答案?.

于 2013-01-27T16:52:47.880 回答
1

这个错误只是意味着 mersenne.cpp 没有被编译......确保它被编译和链接......

于 2013-01-27T17:12:58.643 回答