TJPEGImage: linker Fehler in DLL
-
Hallo,
ich schreibe gerade eine DLL die ein paar Funktionene zur Verfügung stellt. Unter anderen etwa das Speichern von einem Bitmap als JPEG Image. Zuvor hab ich den Code in einem Projekt gehabt (.exe), indem das Ganze einwandfrei funktioniert hat. Doch jetzt in der DLL bekomme ich einen Linker-Fehler, dass der Linker nicht den Construktor, Destruktor und die entsprechende Methode linken kann. Muss man hier noch eine .lib Datei einbinden? Wenn ja welche?
Danke.
-
Da bist du nicht der einzige mit dem Problem. Hab das auch schon vor ner ganzen Weile versucht und bin gescheitert. Diese Konvertierungsfunktion (BMP->JPEG) ist die einzige Funktion, die ich als extra .cpp einbinde, falls sie im Projekt benötigt wird. Falls es doch eine Lösung dafür gibt, würde mich das auch interessieren.
Schollo
-
@mttias
Was ist in der DLL alles drin?
Wo steht der Constructor ...?
Wie rufst Du die DLL auf
Soll die DLL in anderen Compilern anwendbar sein oder nur für BCB?
-
zur zeit möchte ich die dll eigentlich nur für den BCB verwenden. die dll besitzt eine klasse in der ein TBitmap objekt gespeichert wird und methoden um es als bitmap, tiff oder jpeg zu speichern. der code sieht wie folgt aus:
#ifndef _ImageH #define _ImageH #include <stdio> #include <windows> #include <vcl.h> #include <Graphics.hpp> #include <jpeg.hpp> #include <algorithm> using std::min; using std::max; #include <gdiplus.h> #ifdef __DLL__ # define DLL_EXP __declspec(dllexport) #else # define DLL_EXP __declspec(dllimport) #endif using namespace std; class DLL_EXP ImageManipulation { protected: TImage *m_pImage; Graphics::TBitmap *m_pBitmapPicture; Gdiplus::GdiplusStartupInput *gdiplusStartupInput; ULONG_PTR gdiplusToken; int GetEncoderClsid(const WCHAR* format, CLSID* pClsid); public: ImageManipulation(); ~ImageManipulation(); void Terminate(); virtual void Initialize(TComponent *pAOwner, TWinControl *pParent, float* pFeatureData, int iSize, int iTop, int iLeft, int iOuterWidth, int iOuterHeight, int iDBWidth, int iDBHeight); void InitializeGDI(); void ShutDownGDI(); void SaveAsBitmap(AnsiString sLocation); void SaveAsTIFF(AnsiString sLocation); void SaveAsJPEG(AnsiString sLocation); }; #pragma hdrstop #include "Image.h" #pragma package(smart_init) #pragma argsused BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fwdreason, LPVOID lpvReserved) { return 1; } void ImageManipulation::SaveAsJPEG(AnsiString sLocation) { TJPEGImage *jpg = new TJPEGImage(); jpg->Assign(m_pBitmapPicture); jpg->SaveToFile(sLocation + ".jpg"); delete jpg; }
-
Und wo steht der Constructor ???
In Image.cpp ?
dann muss die dem Projekt zugefügt sein.
-
was für einen konstruktor meinst du? in dieser dll steht folgender konstruktor. die cpp datei ist dem projekt schon hinzugefügt.
ImageManipulation::ImageManipulation() { m_pImage = NULL; m_pBitmapPicture = NULL; } ImageManipulation::~ImageManipulation() { Terminate(); }aber ich bekomme ja einen fehler, dass er nicht den konstruktor für TJPEGImage linken kann, der ja eigentlich vom bcb zur verfügung gestellt werden sollte?
-
Ach den Constructor findet er nicht.
Da seh ich 2 Varianten
1. BCB neu installieren
2. Such mal nach Dateien jpeg.obj o.ä.
Deren Ordner muss in den Linker Verzeichnissen eingetragen sein
-
Wie bei jeder Erstellung einer DLL als Kommentar steht, sollte man ANSIString in DLL's so nicht nutzen. Wie sich aus dem Text ergibt eigentlich gar nicht. Ersetzen durch char * und Aufruf mit .c_str().
-
danke für die hilfe. ich hab nun die datei jpeg.obj und jconsts.obj einfach dem projekt hinzugefügt, da die verzeichnisse schon angegeben waren. auf jeden fall hat ers mir mal fertig compiliert.