Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 令人沮丧的C++;关于未定义引用的编译器错误_C++_Linker - Fatal编程技术网

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

C++ 令人沮丧的C++;关于未定义引用的编译器错误,c++,linker,C++,Linker,所以,这个问题是一个愚蠢的错误,但我已经花了大约一个小时来解决它,似乎无法解决它 我有一个类main.cpp,它充满了随机GUI垃圾(我认为与我的问题不太相关),但在我的一个方法中,我引用了我的另一个类“TiffSpec” TiffSpec是我编写的一个类,到目前为止没有编译错误。我得到的编译错误是: “对TiffSpec::TiffSpec(std::basic_字符串)的未定义引用” 注意:我不认为这是string类的问题,因为我试图编写一个默认构造函数并引用它,但在没有“std::basi

所以,这个问题是一个愚蠢的错误,但我已经花了大约一个小时来解决它,似乎无法解决它

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

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

“对
TiffSpec::TiffSpec(std::basic_字符串)
的未定义引用”

注意:我不认为这是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”
/*创建棋盘图像*/
#定义checkImageWidth 1024
#定义checkImageHeight 1024
GLubyte checkImage[checkImageHeight][checkImageWidth][3];
静态闪烁高度;
//所有非主要方法的列表
void init(void);
作废显示(作废);
空洞重塑(int w,int h);
无效运动(整数x,整数y);
void read_next_命令(无符号字符键,int x,int y);
void makeCheckImage(void);
无效主循环(字符行[]);
void evaluateLine(字符行[],标准::向量分隔符);
void evaluateCommand(std::list命令);
无效读取(std::list命令);
无效绘制(std::list命令);
无效颜色(std::list命令);
无效移动(std::list命令);
void TiffStat(标准::字符串文件名);
std::string convertInputOfloting(std::string输入);
std::字符串零值(std::字符串输入);
std::vector getDelimiters();
//列表末尾
无效的
TiffStat(标准::字符串文件名)
{
TiffSpec*测试=新的TiffSpec(文件名);
}
以下是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);
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#ifndef TIFFSPEC_H_
#定义TIFFSPEC_H_
使用名称空间std;
类规范{
公众:
TiffSpec();
TiffSpec(标准::字符串文件名);
为了更好地衡量,这里有一些来自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;
#包括“TiffSpec.h”
#包括
bool isLittleEndian();
无效字节(无符号字符*b,整数n);
bool标记已识别(未签名的短标记);
布尔字段类型识别(无符号短字段类型);
无效值(IFDEntry和entry、ifstream和fileStream);
valueTypes retrieveCorrectType(无符号短字段类型、无符号长numberOfValues);
int getFieldByteSize(短字段类型);
TiffSpec::TiffSpec()
{}
TiffSpec::TiffSpec(标准::字符串文件名)
{
std::ifstream文件流;
知道我的问题是什么吗?还有,有没有更有效的方法来表示编码块,而不是在每行前面写4个空格?查阅参考指南,没有看到任何

<>我想我知道什么是错了。我第一次使用Eclipse(至少在C++中),并且在某些方面被MSV宠爱了。其中一种是make文件。我想问题是我的MaFig文件。

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: $(CLI_OBJECTS)
   $(LINK) $(CLI_OBJECTS) $(LDADD) $(LIBS)
SHELL=/bin/sh
前缀=/usr
CC=gcc
C++ = g++
GLUT_LIBS=$(前缀)/lib/libglut.so.3
X_LIBADD=-lXmu-lXext-lXi-lX11
include=-Iinclude-I$(前缀)/include
LDADD=$(GLUT_LIBS)$(前缀)/lib/libGLU.so.1$(前缀)/lib/libGL.so.1-lm
CFLAGS=-g-O2-Wall-fomit帧指针-ffast math-feexpensive-optimizations-D_可重入
编译=$(CC)$(DEFS)$(包括)$(CPPFLAGS)$(CFLAGS)
链接=$(CC)$(CFLAGS)$(LDFLAGS)-o$@
.后缀:
.后缀:.cpp.c.o
.c.o.:
$(编译)-c$<
.cpp.o:
$(C++)$(DEFS)$(包括)$(CPPFLAGS)$(CFLAGS)-C$<
全部:主要
CLI_OBJECTS=main.o
main:$(CLI\u对象)
$(链接)$(CLI_对象)$(LDADD)$(LIBS)
清洁:
-rm-f*.o$(程序)

我相信这只与main.o存在有关。但我不知道我到底需要写什么来纠正它。

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

对于GCC,请确保将
TiffSpec.o
添加到链接器中(当然,还要将
TiffSpec.cpp
编译到
TiffSpec.o


对于MSVC,请确保添加要编译并链接到可执行文件中的
TiffSpec.cpp
确保在TiffSpec.o中链接。

似乎是
CLI\u OBJECTS
行列出了对象文件。添加TiffSpec.o:

CLI_OBJECTS=main.o TiffSpec.o

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

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

这意味着
main
应该从
CLI\u OBJECTS
中列出的文件中构建,方法是运行下面一行的命令。

我正在使用eclipse(我正在使用Ubuntu进行此项目)我从IDE在项目中创建了这个类。在同一个项目文件夹中有个类,它们的属性框显示的所有内容似乎都在同一个项目中。是否有其他方法可以确保这一点?要在StackOverflow中漂亮地打印源代码,您可以像往常一样编写代码,或者最好使用您最喜欢的编辑器中的“复制和粘贴”,完成后选择t打开整个块并按Ctrl+K。对于其他快捷键,只需将鼠标悬停在文本区域的按钮上。@xhantt,你在说什么?代码/is/在格式化程序中运行。SO编辑器中有一个带有一组1和0的按钮,将高亮显示的块格式化为代码(即缩进4个空格).你能再解释一下吗?我认为这是正确的方向。我编辑了这个问题。