dll dev cpp - linking problem

0

Witam,

korzystam z devcpp, zrobilem w nim DLL ( file, new, project, dll). W innej aplikacji probuje wywolac funkcje zawarta w DLLce, otrzymuje nastepujacy blad:
[Linker error] undefined reference to `_imp___Z15GetArrayFromBMPPc'

Normalnie taki blad dostaje gdy nie zalacze pliku .lib do linkera.
Podczas tworzenia DLL devcpp nie stworzyl pliku .lib, tylko .dll , .a, .def .
Czy problem tkwi w tym, ze nie ma pliku .lib?
Jesli tak to jak ten plik stworzyc?
Z gory dziekuje za pomoc!

0

.a to statyczna biblioteka, mozesz go wlaczyc zamiast .dll/.lib - ale wtedy to bedzie wkompilowane na sztywno, bez dynamicznego wiazania jak .dll..

a jak jest .dll to i powinien byc .lib -- jak nie ma .lib to widac zapomniales o declspec(dllexport) przy eksportowanych funkcjach i ta .dll NIC eksportuje!

0

Ja zawsze otwieram funkcje dynamicznie, po to robie bibliotekę, żeby nie była ona razem z aplikacją, a dołączenie jej statyczne, zwiąże ją z aplikacją:

[code]
//definiujesz typ funckji importowanej z jej parametrami
//przykładowo importujesz funkcje: bool funkcja(int,char);
HINSTANCE hLib=LoadLibrary("nazwa.dll"); //ładujemy bibliotekę
typedef (*typ_fun)(int,char); //definiujemy typ dla funkcji funkcja
typ_fun funkcja=(typ_fun)GetProcAddress(hLib,"funkcja");
//mamy wskaźnik do tej funkcji, możemy ją normalnie wywływać
FreeLibrary(hLib);//po skończeniu pracy z funkcją zwalniamy bibliotekę
[/code]

0

Być może jest to spowodowane brakiem extern "C" przy definicji funkcji.

0

crayze/gosc:
extern"C" - jak dzialasz przez GetProcAddress to tak, extern C sie przyda. ale autor wyraznie napisal ze ma problem z LINKOWANIEM. gdyby korzystal z loadlibrary/getprocaddress to jakby ten blad sie mial pojawic?

0

To jest moj kod do ladowania DLL, korzystalem z zrodelm internerowych do tego. Rowniez kiedys ladowalem inna DLL w ten sam sposob:

#include <cstdlib>
#include <iostream>
#include <windows.h>
#include "EasyBMP.h"
#include "bmp1.h"

using namespace std;

typedef float***(*fun)(char *);

typedef int (*fun1)(char *,float ***,int , int ,int ,int );

int main(int argc, char *argv[]) {

char  *file="example1.bmp", *file1="example7.bmp";
float ***array;
 
HMODULE hModule = LoadLibrary("bmp1.dll");
if(hModule == NULL) return 0;  


fun hFun =(fun)GetProcAddress(hModule, "GetArrayFromBMP");  
if (hFun == NULL) return 0; 

array=GetArrayFromBMP(file);

fun1 hFun1 =(fun1)GetProcAddress(hModule,"GetArrayToBMP");
if (hFun1 == NULL) return 0; 
GetArrayToBMP(file1,array,100,100,8,1);

FreeLibrary(hModule);    
    //system("PAUSE");
return EXIT_SUCCESS;

}

Zakladam,ze problem lezy w tworzeniu DLL. Tak wyglada moj header do DLL ( w pliku cpp sa zdefiniowane funkcje ).

#ifndef DLL_H
#define DLL_H

#if BUILDING_DLL

  1. define BMP1 __declspec (dllexport)
    #else /* Not BUILDING_DLL */
  2. define BMP1 __declspec (dllimport)
    #endif /* Not BUILDING_DLL */

extern "C" __declspec(dllexport)float ***GetArrayFromBMP(char *fileName);

extern "C" __declspec(dllexport)int GetArrayToBMP(char *fileName,float ***array,int width, int height,int bitDepth,int depth);

class BMP1 DllClass
{
public:
DllClass();
virtual ~DllClass(void);

private:

};

#endif /* DLL_H */

0

Skopiuj plik .def do folderu dev-cpp\bin i tam uruchom polecenie
dlltool -k -d *.def -l lib*.a
zastępując gwiazdkę nazwą pliku .def. Powstały plik lib*.a skopiuj do folderu swojego projektu, lub do głównego \lib

Alda, plik .a to właśnie .lib w wersji gcc, więc nie musisz robić tego co napisałem bo już masz ten plik.

1 użytkowników online, w tym zalogowanych: 0, gości: 1