[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).


  • Mod

    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!


Anmelden zum Antworten