在单独的.cpp文件和makefile链接中在类外定义的c ++函数

时间:2013-01-27 16:33:44

标签: c++ class function header makefile

我有一个项目使用来自 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;
}

有什么想法吗?

2 个答案:

答案 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没有被编译......确保它被编译和链接......