[Gelöst] Nicht aufgelöste Token (LNK2028&2019)
-
Hi Leute,
ich sitz jetzt schon einige Stunden an einem ziemlich dämlichen Compilerfehler, den ich nicht aufgelöst bekommen.
Das Programm hat ohnr Probleme funktiontioniert, nachdem ich aber einige Erweiterungen eingefügt habe, gabs dann doch probleme, weil ich die stdafx.h, rausnehmen musste, da das auch alles unter Linux compilierbar sein soll, und da ja meines Wissens nach auch Windows Zeugs drin rum hängt.
Mein Problem ist jetzt aber, dass ich jetzt unten stehenden Fehler erhalte, und es einfach nicht gebacken bekomme diesen zu lösen....
1>------ Erstellen gestartet: Projekt: Heatblade, Konfiguration: Debug Win32 ------
1>Heatblade.obj : error LNK2028: Nicht aufgelöstes Token (0A0003BC) ""void __cdecl initBild(unsigned char *,char *)" (?initBild@@$$FYAXPAEPAD@Z)", auf das in Funktion ""void __cdecl BMPInit(int,struct bmp_file *)" (?BMPInit@@$$FYAXHPAUbmp_file@@@Z)" verwiesen wird.
1>Heatblade.obj : error LNK2028: Nicht aufgelöstes Token (0A000456) ""unsigned char * __cdecl loadBMPFile(char *)" (?loadBMPFile@@$$FYAPAEPAD@Z)", auf das in Funktion ""void __cdecl BMPInit(int,struct bmp_file *)" (?BMPInit@@$$FYAXHPAUbmp_file@@@Z)" verwiesen wird.
1>Heatblade.obj : error LNK2028: Nicht aufgelöstes Token (0A000464) ""struct bmpinfoheadertag __cdecl loadBMPInfoHeader(char *)" (?loadBMPInfoHeader@@$$FYA?AUbmpinfoheadertag@@PAD@Z)", auf das in Funktion ""void __cdecl BMPInit(int,struct bmp_file *)" (?BMPInit@@$$FYAXHPAUbmp_file@@@Z)" verwiesen wird.
1>Heatblade.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""unsigned char * __cdecl loadBMPFile(char *)" (?loadBMPFile@@$$FYAPAEPAD@Z)" in Funktion ""void __cdecl BMPInit(int,struct bmp_file *)" (?BMPInit@@$$FYAXHPAUbmp_file@@@Z)".
1>Heatblade.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""void __cdecl initBild(unsigned char *,char *)" (?initBild@@$$FYAXPAEPAD@Z)" in Funktion ""void __cdecl BMPInit(int,struct bmp_file *)" (?BMPInit@@$$FYAXHPAUbmp_file@@@Z)".
1>Heatblade.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""struct bmpinfoheadertag __cdecl loadBMPInfoHeader(char *)" (?loadBMPInfoHeader@@$$FYA?AUbmpinfoheadertag@@PAD@Z)" in Funktion ""void __cdecl BMPInit(int,struct bmp_file *)" (?BMPInit@@$$FYAXHPAUbmp_file@@@Z)".
1>C:\Users\Stephan\documents\visual studio 2010\Projects\Heatblade\Debug\Heatblade.exe : fatal error LNK1120: 6 nicht aufgelöste externe Verweise.
========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========Die stellen beziehen sich auf folgenden Code:
extern "C" #ifndef BMP_READER_H #define BMP_READER_H #if defined(_WIN32) // #include "stdafx.h" #include <Windows.h> #endif #include <iostream> #include <fstream> //word == unsigned short //dword == unsigned long //http://www.datasource.de/programmierung/tab33_cppdatentypen.html struct bmpfileheadertag; struct bmpinfoheadertag; typedef struct bmpfileheadertag{ unsigned short bfType; //ASCII-Zeichenkette "BM" (Dezimalwert 19778) unsigned long bfSize; //Größe der BMP-Datei in Byte (unzuverlässig) unsigned long bfReserved; //0 unsigned long bfOffBits; //Offset der Bilddaten in Byte vom Beginn der Datei an }BMPFILEHEADER; typedef struct bmpinfoheadertag{ unsigned long biSize; //40 (Größe der BITMAPINFOHEADER-Struktur in Byte) long biWidth; //Breite der Bitmap in Pixel. long biHeight; //Der Betrag gibt die Höhe der Bitmap in Pixel an. // Ist der Wert positiv, so ist die Bitmap eine sogenannte "bottom-up"-Bitmap (die Bilddaten beginnen mit der untersten und enden mit der obersten Bildzeile). Dies ist die gebräuchlichste Variante. // Ist der Wert negativ, so ist die Bitmap eine "top-down"-Bitmap (die Bilddaten beginnen mit der obersten und enden mit der untersten Bildzeile). unsigned short biPlanes; //1 (Stand in einigen älteren Formaten wie PCX für die Anzahl der Farbebenen, wird aber für BMP nicht verwendet) unsigned short biBitCount; //Gibt die Farbtiefe der Bitmap in bpp an; muss einer der folgenden Werte sein: 1, 4, 8, 16, 24 oder 32. Bei 1, 4 und 8 bpp sind die Farben indiziert. 16 und 32 bpp sind ungebräuchlich. unsigned long biCompression; //Einer der folgenden Werte: // 0 (BI_RGB): Bilddaten sind unkomprimiert. // 1 (BI_RLE8): Bilddaten sind lauflängenkodiert für 8 bpp. Nur erlaubt wenn biBitCount=8 und biHeight positiv. // 2 (BI_RLE4): Bilddaten sind lauflängenkodiert für 4 bpp. Nur erlaubt wenn biBitCount=4 und biHeight positiv. // 3 (BI_BITFIELDS): Bilddaten sind unkomprimiert und benutzerdefiniert (mittels Farbmasken) kodiert. Nur erlaubt wenn biBitCount=16 oder 32; ungebräuchlich. unsigned long biSizeImage; //Wenn biCompression=BI_RGB: Entweder 0 oder die Größe der Bilddaten in Byte. //Ansonsten: Größe der Bilddaten in Byte. long biXPelsPerMeter; //Horizontale Auflösung des Zielausgabegerätes in Pixel pro Meter; wird aber für BMP-Dateien meistens auf 0 gesetzt. long biYPelsPerMeter; //Vertikale Auflösung des Zielausgabegerätes in Pixel pro Meter; wird aber für BMP-Dateien meistens auf 0 gesetzt. unsigned long biClrUsed; // Wenn biBitCount=1: 0. // Wenn biBitCount=4 oder 8: die Anzahl der Einträge der Farbtabelle; 0 bedeutet die maximale Anzahl (16 bzw. 256). // Ansonsten: Die Anzahl der Einträge der Farbtabelle (0=keine Farbtabelle). Auch wenn sie in diesem Fall nicht notwendig ist, kann dennoch eine für die Farbquantisierung empfohlene Farbtabelle angegeben werden. unsigned long biClrImportant; // Wenn biBitCount=1, 4 oder 8: Die Anzahl sämtlicher im Bild verwendeten Farben; 0 bedeutet alle Farben der Farbtabelle. // Ansonsten: // Wenn eine Farbtabelle vorhanden ist und diese sämtliche im Bild verwendeten Farben enthält: deren Anzahl. // Ansonsten: 0. }BMPINFOHEADER; unsigned char* loadBMPFile(char *filename); BMPINFOHEADER loadBMPInfoHeader(char *filename); void initBild(unsigned char* bild, char* filename); //NOTE: The arangement of the data have to be BGR (NOT! RGB) int writeBMPfile(char* filename, long biWidth, long biHeight, unsigned char* data); #endif
//#include "stdafx.h" #ifdef BMP_READER_CPP #define BMP_READER_CPP #include "bmp-reader.h" using namespace std; BMPINFOHEADER loadBMPInfoHeader(char* filename){ fstream bmpfile; BMPFILEHEADER bmpFileHeader; BMPINFOHEADER info; bmpfile.open(filename, ios::in|ios::binary); if(bmpfile.good()){ cout<<"lese aus Datei"<<endl; bmpfile.read(reinterpret_cast<char*>(&bmpFileHeader.bfType), sizeof(unsigned short)); bmpfile.read(reinterpret_cast<char*>(&bmpFileHeader.bfSize), sizeof(unsigned long)); bmpfile.read(reinterpret_cast<char*>(&bmpFileHeader.bfReserved), sizeof(unsigned long)); bmpfile.read(reinterpret_cast<char*>(&bmpFileHeader.bfOffBits), sizeof(unsigned long)); cout<<"Der File-Header enthält folgende Daten:"<<endl; cout<<"bfType:" <<bmpFileHeader.bfType<<endl; cout<<"bfSize:" <<bmpFileHeader.bfSize<<endl; cout<<"bfReserved:" <<bmpFileHeader.bfReserved<<endl; cout<<"bfOffBits:" <<bmpFileHeader.bfOffBits<<endl; bmpfile.read(reinterpret_cast<char*>(&info),sizeof(BMPINFOHEADER)); cout<<"Der Info-Header enthält folgende Daten:"<<endl; cout<<"biSize:"<<info.biSize<<endl; cout<<"biWidth:"<<info.biWidth<<endl; cout<<"biHeight:"<<info.biHeight<<endl; cout<<"biPlanes:"<<info.biPlanes<<endl; cout<<"biBitCount:"<<info.biBitCount<<endl; cout<<"biCompression:"<<info.biCompression<<endl; cout<<"biSizeImage:"<<info.biSizeImage<<endl; cout<<"biXPelsPerMeter:"<<info.biXPelsPerMeter<<endl; cout<<"biYPelsPerMeter:"<<info.biYPelsPerMeter<<endl; cout<<"biClrUsed:"<<info.biClrUsed<<endl; cout<<"biClrImportant:"<<info.biClrImportant<<endl; return info; } else{ cout<<"FEHLER: BMP:"<<filename<<" kann nicht geöffnet werden"<<endl; return 0; } } void initBild(unsigned char* bild, char* filename){ BMPINFOHEADER info; info=loadBMPInfoHeader(filename); if(info.biSizeImage!=0){ bild=new unsigned char [info.biSizeImage]; } else{ int size; size=info.biWidth*3; if(size%4==0){ size*=info.biHeight; } else{ size+=4-(info.biWidth%4); size*=info.biHeight; } cout<<"size of the image:"<<size<<endl; bild=new unsigned char[size]; } } unsigned char *loadBMPFile(char *filename){ fstream bmpfile; BMPFILEHEADER bmpFileHeader; BMPINFOHEADER info; unsigned char *bmpImage; int imageIdx=0; unsigned char tempRGB; cout<<"filename:"<<filename<<endl; bmpfile.open(filename, ios::in|ios::binary); if(bmpfile.good()){ cout<<"lese aus Datei: "<<filename<<endl; bmpfile.read(reinterpret_cast<char*>(&bmpFileHeader.bfType), sizeof(unsigned short)); bmpfile.read(reinterpret_cast<char*>(&bmpFileHeader.bfSize), sizeof(unsigned long)); bmpfile.read(reinterpret_cast<char*>(&bmpFileHeader.bfReserved), sizeof(unsigned long)); bmpfile.read(reinterpret_cast<char*>(&bmpFileHeader.bfOffBits), sizeof(unsigned long)); bmpfile.read((char*)&info,sizeof(BMPINFOHEADER)); //Move the Data-Pointer to the next read position bmpfile.seekg(bmpFileHeader.bfOffBits, ios::beg); //allocate memory for the bmp image data int size; if(info.biSizeImage!=0){ size=info.biSizeImage; } else{ size=info.biWidth*3; if(size%4==0){ size*=info.biHeight; } else{ size+=4-(info.biWidth%4); size*=info.biHeight; } } bmpImage = new unsigned char [size]; bmpfile.read(reinterpret_cast<char*>(bmpImage), size); //swap the r and b values, because BMP is BGR, but we want RGB for(imageIdx=0; imageIdx<size; imageIdx+=3){ tempRGB=bmpImage[imageIdx]; bmpImage[imageIdx]=bmpImage[imageIdx+2]; bmpImage[imageIdx+2]=tempRGB; } bmpfile.close(); cout<<"Auslesen beendet. Datei wurde geschlossen"<<endl; } else{ cout<<"FEHLER! Kann nicht aus Datei lesen"<<endl; } /* for(int i=0; i<info.biSizeImage; i+=3){ if(float(bmpImage[i])!=205 || float(bmpImage[i+1])!=205 || float(bmpImage[i+2])!=205){ cout<<float(bmpImage[i])<<endl; cout<<float(bmpImage[i+1])<<endl; cout<<float(bmpImage[i+2])<<endl; } } */ return bmpImage; } int writeBMPfile(char* filename, long biWidth, long biHeight, unsigned char* data){ fstream bmpfile; BMPFILEHEADER fileheader; BMPINFOHEADER infoheader; //calculate if a line is a multiple of 4 bytes int alignbytes; alignbytes=(biWidth*3)%4; //vorbereiten der Header fileheader.bfType=19778; fileheader.bfSize=54+biHeight*(biWidth*3+alignbytes); fileheader.bfReserved=0; fileheader.bfOffBits=54; //this is a static value because, we don´t use colour table infoheader.biSize=40; infoheader.biWidth=biWidth; infoheader.biHeight=biHeight; infoheader.biPlanes=1; infoheader.biBitCount=24; infoheader.biCompression=0; infoheader.biSizeImage=0;//0 because this value is not save infoheader.biXPelsPerMeter=0; infoheader.biYPelsPerMeter=0; infoheader.biClrUsed=0; infoheader.biClrImportant=0; bmpfile.open(filename, ios::out|ios::binary); if(bmpfile.good()){ //write fileheader bmpfile.write(reinterpret_cast<char*>(&fileheader.bfType), sizeof(unsigned short)); bmpfile.write(reinterpret_cast<char*>(&fileheader.bfSize), sizeof(unsigned long)); bmpfile.write(reinterpret_cast<char*>(&fileheader.bfReserved), sizeof(unsigned long)); bmpfile.write(reinterpret_cast<char*>(&fileheader.bfOffBits), sizeof(unsigned long)); //write infoheader bmpfile.write(reinterpret_cast<char*>(&infoheader.biSize), sizeof(unsigned long)); bmpfile.write(reinterpret_cast<char*>(&infoheader.biWidth), sizeof(long)); bmpfile.write(reinterpret_cast<char*>(&infoheader.biHeight), sizeof(long)); bmpfile.write(reinterpret_cast<char*>(&infoheader.biPlanes), sizeof(unsigned short)); bmpfile.write(reinterpret_cast<char*>(&infoheader.biBitCount), sizeof(unsigned short)); bmpfile.write(reinterpret_cast<char*>(&infoheader.biCompression), sizeof(unsigned long)); bmpfile.write(reinterpret_cast<char*>(&infoheader.biSizeImage), sizeof(unsigned long)); bmpfile.write(reinterpret_cast<char*>(&infoheader.biXPelsPerMeter), sizeof(long)); bmpfile.write(reinterpret_cast<char*>(&infoheader.biYPelsPerMeter), sizeof(long)); bmpfile.write(reinterpret_cast<char*>(&infoheader.biClrUsed), sizeof(unsigned long)); bmpfile.write(reinterpret_cast<char*>(&infoheader.biClrImportant), sizeof(unsigned long)); //write image data //remember, that the data in one line allways have to be a multiple of 4 bytes unsigned char tempRGB; unsigned char* writebuffer=new unsigned char[biHeight*(biWidth*3+alignbytes)]; int wpos;//writepos for(int i=0; i<infoheader.biHeight; i++){ for(int j=0; j<infoheader.biWidth*3; j+=3){ //we have to reorder, because BMP file need BGE instead of RGB wpos=i*infoheader.biWidth*3+j; writebuffer[wpos+0]=data[wpos+2];//B writebuffer[wpos+1]=data[wpos+1];//G writebuffer[wpos+2]=data[wpos+0];//R } for(int i=0; i<alignbytes; i++){ writebuffer[wpos+3+i]='0'; } } //write the bufferd data into the file on disk. Buffer the write improve the performance by a factor 5! bmpfile.write(reinterpret_cast<char*>(writebuffer), sizeof(char)*biHeight*(biWidth*3+alignbytes));//B bmpfile.close(); if(!bmpfile.good()){ cout<<"FEHLER:"<<filename<<" konnte nicht geschlossen werden"<<endl; return -2; } } else{ cout<<"FEHLER:"<<filename<<" konnte nicht geöffnet werden"<<endl; return -1; } return 1; } #endif
und eben meine "main.cpp" in der ich bmp-reader.h als include habe, und dann in der folgenden Funktion verwende:
void BMPInit(int num_pics, bmp_file* pictures){ //erstellen des bmp-arrays pictures = new bmp_file[num_pics]; //Einlesen der BMP char** filename= new char* [num_pics]; char temp[1024]; for(int i=0; i<num_pics; i++){ filename[i]= new char[256]; sprintf(temp, "BMP_%i.bmp", i); strcpy(filename[i], temp); } for(int i=0; i<num_pics; i++){ pictures[i].info=loadBMPInfoHeader(filename[i]); initBild(pictures[i].bild, filename[i]); pictures[i].bild=loadBMPFile(filename[i]); } //free the buffer for the filenames delete filename; }
Ich versteh wirklich beim besten willen nicht, wo denn jetzt das Problem ist...
Es ist nichts falsch geschrieben, ich verwende keine dll, zumindest nicht bewusst, und auch sonst bin ich hier und sonst wo allen möglichen Ursachen nachgegangen.
Ich hab als Subsystem Console gewählt, es ist eine .exe als Datei usw. usw.
Ich raffs echt nicht... Wäre sehr nett, wenn ihr mir helfen könntet.
-
Sicher, dass es
#ifdef BMP_READER_CPP #define BMP_READER_CPP
sein soll? Da fehlt wohl ein "n" (ka, ob das mit deinen Fehlern zusammenhängt).
-
Kann es sein, dass Du diese CPP Datei einfach nciht in das Projekt einegfügt hast?
-
Doch alle .cpp und .h files sind drin. Ist von mir ja alles selbst runtergehackt worden in den letzten Tagen/Wochen.
Das mit dem #ifdef kanns aber sein. Ich teste es mal gleich. Das wärs natürlich wenns daran liegt
EDIT:
OMFG das wars wirklich
DANKE DANKE DANKE DANKE DANKE für die Hilfe!
Da hätte ich wohl noch Stunden suchen können, ohne den Fehler zu finden. Wegen so nem Mist Stunden verplempern... Wies ankotzt... So was findet sich halt auch vor allem so sau schwer, und man wird irgendwann auch total blind für solche Fehler am eigenen Code.
Also nochmals VIELEN DANK!