2009-02-15 115 views
0

所以,這是一個愚蠢的錯誤,但我一直在黑客攻擊大約一個小時,似乎無法解決它。令人沮喪的C++編譯器錯誤,關於未定義的引用

我有一個類的main.cpp這是充滿隨機的GUI廢話(不是真的有關我的問題,我相信),但在我的方法之一,我做出一個又一個的我的班「TiffSpec」

參考

TiffSpec是我寫的一個類,到目前爲止它沒有編譯錯誤。編譯錯誤我得到的是:

「未定義參考TiffSpec::TiffSpec(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)

注:我不相信這是String類問題,我試着寫一個默認的構造函數和引用,而且仍然有沒有「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 [email protected] 

.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在那裏。但我確實需要寫出來糾正它,但我不知道。

+0

爲了在StackOverflow中漂亮地打印源代碼,您照常編寫代碼,或者更好地使用從您最喜愛的編輯器複製和粘貼,完成後選擇整個塊並按下Ctrl + K。對於其他快捷方式,只需將鼠標懸停在textarea的按鈕上即可。 – Ismael 2009-02-15 01:23:38

+0

@xhantt,你在說什麼?代碼/通過格式化程序運行。 – strager 2009-02-15 01:24:55

+0

在SO編輯器中有一個1和0的按鈕,它會將高亮區塊格式化爲代碼(即縮進4個空格)。 – 2009-02-15 01:30:25

回答

2

這是CLI_OBJECTS行似乎列出的對象文件。添加TiffSpec。○:

CLI_OBJECTS=main.o TiffSpec.o 

的連接命令來自這個規則在Makefile:

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

這是說main應從CLI_OBJECTS列出的文件由上線運行的命令建造下面。

4

確保您已將TiffSpec.cpp鏈接到您的項目中。如何做到這一點取決於你的開發環境。

對於GCC,請確保您將TiffSpec.o添加到您的鏈接器(當然編譯TiffSpec.cppTiffSpec.o)。

對於MSVC,請確保您添加TiffSpec.cpp以編譯並鏈接到您的可執行文件中。 (FIXME)

1

確保您在TiffSpec.o中鏈接。

相關問題