我有一个项目使用来自 CRandomMersenne 类的函数,在头文件 randomc.h 中声明;函数在不同的文件 mersenne.cpp 中定义。在我的makefile中,我有一个使用该类函数的对象* MC_funcs2.o *。 source * 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;
}
有什么想法吗?
答案 0 :(得分: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的更多信息,请参阅this tutorial中的How to make a SIMPLE C++ Makefile?或优秀的SO答案。
答案 1 :(得分:1)
这个错误只是意味着mersenne.cpp没有被编译......确保它被编译和链接......