__declspec(dllimport) na początku każdego szukanego symbolu w bibliotece statycznej

0

Cześć,

Celem jest zrobienie dll do operowania na plikach graficznych. Sam algorytmów nie będę implementował. Użyję do tego biblioteki imagemagick, a dokładnie jej portu do C++ - Magick++. Chcę ją linkować statycznie do mojej dll, żeby była samodzielna. Cała biblioteka będzie w C++, ale interfejs musi być w C.

Z pomocą tutoriala: http://www.imagemagick.org/script/install-source.php zbudowałem statyczne biblioteki ImageMagick, w których jest również Magick++.

Przy budowaniu mojej dll linkuję do bibliotek CORE_RL_MagickWand.lib, CORE_RL_MagickCore.lib i CORE_RL_Magick++.lib

Aktualne poglądowe rozwiązanie w mojej dll:

dllCHeader.h

#ifndef DLL_C_HEADER
#define DLL_C_HEADER

#ifdef DLL_COMPILE   
#define DLL_EXPORT __declspec(dllexport) 
#else   
#define DLL_EXPORT __declspec(dllimport) 
#endif

#include "dllCppHeader.h"

#ifdef __cplusplus
extern "C" {
#endif
DLL_EXPORT int robCos( int parametr );

#ifdef __cplusplus
}
#endif
#endif

dllCSource.cpp

#include "dllCHeader.h"

#ifdef __cplusplus
extern "C" {
#endif

    DLL_EXPORT int robCos( int parametr )
    {
        return robCosCpp( parametr );
    }
#ifdef __cplusplus
}
#endif

dllCppSource.cpp

#include <Magick++.hpp>

int robCosCpp( int parametr )
{
    return Magick::robCos( parametr );
}

Nie wiem co zrobiłem źle, ale mam problem. Przy kompilacji dll lecą unresolved external wszystkie tego typu:

error LNK2001: unresolved external symbol "__declspec(dllimport) public: virtual __thiscall Magick::Image::~Image(void)" (__imp_??1Image@Magick@@UAE@XZ)

Co to oznacza wiem (no nie do końca, ale to potem).

Za pomocą dumpbin podglądnąłem co ma w sobie zbudowana wcześniej biblioteka CORE_RL_Magick++.lib. I znalazłem tam to czego nie mogła znaleźć moja dll:

547 00000000 UNDEF  notype ()    External     | ??1Image@Magick@@UAE@XZ (public: virtual __thiscall Magick::Image::~Image(void))

No jest, tylko nie do końca i myślę, że z tym jest problem. Moja dll wywala błąd, na początku którego jest: **__declspec(dllimport) **.

I tu w końcu moje pytanie, czy może ktoś wie dla czego moja dll we wszystkich szukanych symbolach ma **__declspec(dllimport) **?

1

Po to jest ten myk z dllexport i dllinport, by ten sam nagłówek był użyty podczas kompilacji dllki, jak i podczas jej użycia w innym programie.
Żeby to działało, musisz zdefiniować DLL_COMPILE podczas kompilacji dll.

I wywal to include dllcppheader z nagłówka, bo przecież miał być interfejs w C, a ty temu zaprzeczasz ;)

0

Co do nagłówka to masz rację.

Azarien napisał(a):

Żeby to działało, musisz zdefiniować DLL_COMPILE podczas kompilacji dll.

Oczywiście mam dodaną tę definicję.

Chodzi o to, że visual studio szuka symboli z __declspec(dllimport) w statycznych bibliotekach Magick++ i nie wiem czemu

EDIT
Podołałem, ale żeby nie było, że jak trafię na problem to idę od razu na forum to zaznaczam, że męczyłem się z tym ze dwa dni (:

Dla potomnych: Chodziło o to, że domyślnie Magick++ ma ustawione, że jest używane jako dll. Żeby to zmienić czyli nie mieć wszędzie __declspec(dllimport) trzeba przed #include <Magick++> dać #define STATICK_MAGICK.

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