关于未定义引用的令人沮丧的C ++编译器错误

时间:2009-02-15 01:07:12

标签: c++ linker

所以,这是一个愚蠢的错误问题,但我一直在抨击它大约一个小时,似乎无法解决它。

我有一个类main.cpp,它充满了随机的GUI废话(我认为与我的问题无关)但在我的一个方法中,我引用了另一个类“TiffSpec”

TiffSpec是我写的一个类,到目前为止还没有编译错误。我得到的编译错误是:

“未定义对TiffSpec::TiffSpec(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)的引用”

注意:我不相信这是字符串类的问题,因为我尝试编写默认构造函数并引用它,并且在没有“std :: basic _...”的情况下仍然会出现相同的错误。

TiffSpec.h,TiffSpec.cpp和main.cpp都在同一目录中。

以下是main.cpp中的代码,直到错误:

#include <GL/glut.h>
#include <stdlib.h>
#include <stdio.h>
#include <string>
#include <string.h>
#include <iostream>
#include <sstream>
#include <fstream>
#include <ctype.h>
#include <vector>
#include <list>
#include <typeinfo>
#include <math.h>
#include "TiffSpec.h"



/*  Create checkerboard image   */
#define checkImageWidth 1024

#define checkImageHeight 1024
GLubyte checkImage[checkImageHeight][checkImageWidth][3];

static GLint height;

//list of all non-main methods
void init(void);
void display(void);
void reshape(int w, int h);
void motion(int x, int y);
void read_next_command(unsigned char key, int x, int y);
void makeCheckImage(void);

void main_loop(char line[]);
void evaluateLine(char line[], std::vector<char> delimiters);
void evaluateCommand(std::list<std::string> command);

void read(std::list<std::string> command);
void draw(std::list<std::string> command);
void color(std::list<std::string> command);
void move(std::list<std::string> command);
void TiffStat(std::string fileName);

std::string convertInputToFloating(std::string input);
std::string trimExtraZeros(std::string input);
std::vector<char> getDelimiters();
//end of list


void
TiffStat(std::string fileName)
{
    TiffSpec * testing = new TiffSpec(fileName);
}

以下是TiffSpec.h中代码的开头:

#include <GL/glut.h>
#include <stdlib.h>
#include <stdio.h>
#include <string>
#include <string.h>
#include <iostream>
#include <sstream>
#include <fstream>
#include <ctype.h>
#include <vector>
#include <list>
#include <typeinfo>
#include <math.h>
#include <exception>


#ifndef TIFFSPEC_H_
#define TIFFSPEC_H_

using namespace std;


class TiffSpec {
public:
   TiffSpec();
   TiffSpec(std::string filename);

好的方法是,这里有一些来自TiffSpec.cpp的代码

#include "TiffSpec.h"
#include <algorithm>



bool isLittleEndian();
void ByteSwap_(unsigned char * b, int n);
bool tagRecognized(unsigned short tag);
bool fieldTypeRecognized(unsigned short fieldType);
void gatherValues(IFDEntry & entry, ifstream &fileStream);
valueTypes retrieveCorrectType(unsigned short fieldType, unsigned long numberOfValues);
int getFieldByteSize(short fieldType);

TiffSpec::TiffSpec()
{}

TiffSpec::TiffSpec(std::string fileName)
{
std::ifstream fileStream;

知道我的问题可能是什么吗?还有,是否有更有效的方法来表示编码块而不是在每行之前写入4个空格?看了参考指南,没有看到任何东西......

好吧,我想我已经知道出了什么问题。我是第一次使用eclipse(至少使用c ++)并且在某些方面受到了MSVS的呵护。其中一种方式是make文件。我认为问题是我的makefile。

makefile已提供给我。我想我需要引用这些新类,但在哪里?我是否需要为.h和.cpp文件执行此操作?

生成文件:

SHELL = /bin/sh
prefix = /usr
CC = gcc
C++ = g++ 
GLUT_LIBS = $(prefix)/lib/libglut.so.3
X_LIBADD =  -lXmu -lXext -lXi -lX11
INCLUDES = -Iinclude -I$(prefix)/include  
LDADD = $(GLUT_LIBS) $(prefix)/lib/libGLU.so.1 $(prefix)/lib/libGL.so.1  -lm 
CFLAGS = -g -O2 -Wall -fomit-frame-pointer -ffast-math -fexpensive-optimizations-D_REENTRANT
COMPILE = $(CC) $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS)
LINK = $(CC) $(CFLAGS) $(LDFLAGS) -o $@

.SUFFIXES:
.SUFFIXES: .cpp .c .o 

.c.o:
   $(COMPILE) -c $<

.cpp.o:
    $(C++) $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS) -c $<

all: main

CLI_OBJECTS=main.o 

main: $(CLI_OBJECTS)
   $(LINK) $(CLI_OBJECTS) $(LDADD) $(LIBS)

clean:
     -rm -f *.o $(PROGRAMS)

我认为这只与main.o在那里有关。但我完全需要写的是为了纠正它。我不知道。

3 个答案:

答案 0 :(得分:4)

确保将TiffSpec.cpp关联到项目中。如何做到这一点取决于您的开发环境。

对于GCC,请确保将TiffSpec.o添加到链接器(当然,将TiffSpec.cpp编译为TiffSpec.o。)

对于MSVC,请确保添加TiffSpec.cpp以进行编译并链接到可执行文件中。 (FIXME)

答案 1 :(得分:2)

似乎列出目标文件的CLI_OBJECTS行。添加TiffSpec.o:

CLI_OBJECTS=main.o TiffSpec.o

链接命令来自makefile中的此规则:

main: $(CLI_OBJECTS)
   $(LINK) $(CLI_OBJECTS) $(LDADD) $(LIBS)

这表示main应该通过在下面一行运行命令从CLI_OBJECTS中列出的文件构建。

答案 2 :(得分:1)

确保您在TiffSpec.o中链接。