Projekt, który chce uruchomić inkluduje nagłówek Magick++.h. Ściągnąłem więc paczkę ImageMagick dla Windows ftp://ftp.imagemagick.org/pub/ImageMagick/windows/ gdzie znajduje się biblioteka Magick++. Do Microsoft SDKs skopiowałem foldery Magick++ i magic i ustawiłem poprawne ścieżki w include w odpowiednich plikach. Teraz jak uruchamiam projekt wysypuje się pełno błędów, np:
1>c:\program files\microsoft sdks\windows\v7.0a\include\magick\magick-type.h(134): error C2146: syntax error : missing ';' before identifier 'SignedQuantum'
1>c:\program files\microsoft sdks\windows\v7.0a\include\magick\magick-type.h(134): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
Nie bardzo rozumiem jak mam użyć tej biblioteki, proszę o wskazówki.
Absolutnie nie dodaje się jakiś randomowych nagłówków do toolkitu (sdk systemowego). Przenieś je gdzieś indziej i skonfiguruj je w Visual Studio za pomocą property sheets (reużywalne kawałki konfiguracji projektów).
Instrukcja użycia Magick++ pod Visual Studio 2010.
Ściągamy paczkę z adresu, który podałeś. Rozpakowujemy do jakiegoś katalogu, w którym trzymamy biblioteki 3rd-party. U mnie cała ścieżka to będzie: D:\SharedLibs\ImageMagick-6.7.7
. Najpierw trzeba tę bibliotekę skompilować i zastanowić się w jaki sposób chcemy ją do siebie linkować - statycznie czy dynamicznie. Ja wybrałem tą drugą opcję. Czytamy więc instrukcję i przechodzimy do katalogu VisualMagick\configure
i odpalamy configure.exe
. Wszystkie opcje zostawiamy domyślne i uruchamiamy wygenerowaną solucję w katalogu VisualMagick
. Kompilujemy wszystko raz dla konfiguracji Debug
i raz dla Release
.
Przechodzimy teraz do naszego projektu i tworzymy nowy property sheet dla obu konfiguracji, ja nazwałem ją ImageMagick (Core)
. Dodajemy nowe makro o nazwie ImageMagickDir
i ustawiamy na ścieżkę z naszą biblioteką zakończoną \
(przyjęło się, że wszystkie makra zakończone słówkiem Dir będą miały kończący slash), u mnie: D:\SharedLibs\ImageMagick-6.7.7\
. W C\C++ \ General \ Additional Include Directories
dodajemy ścieżki: $(ImageMagickDir)
oraz $(ImageMagickDir)Magick++\lib
. W zakładce Linker \ General \ Additional Library Directories
dodajemy $(ImageMagickDir)VisualMagick\lib
. To są wspólne opcje dla wszystkich konfiguracji.
Tworzymy property sheet dla konfiguracji debug, np. o nazwie ImageMagick (Shared, Debug)
. W Linker \ Input \ Additional Dependencies
dodajemy CORE_DB_Magick++_.lib
. W Build Events \ Post-Build Event \ Command Line
wklejamy:
copy /Y "$(ImageMagickDir)VisualMagick\bin\CORE_DB_bzlib_.dll" "$(TargetDir)"
copy /Y "$(ImageMagickDir)VisualMagick\bin\CORE_DB_lcms_.dll" "$(TargetDir)"
copy /Y "$(ImageMagickDir)VisualMagick\bin\CORE_DB_magick_.dll" "$(TargetDir)"
copy /Y "$(ImageMagickDir)VisualMagick\bin\CORE_DB_Magick++_.dll" "$(TargetDir)"
copy /Y "$(ImageMagickDir)VisualMagick\bin\CORE_DB_ttf_.dll" "$(TargetDir)"
copy /Y "$(ImageMagickDir)VisualMagick\bin\CORE_DB_wand_.dll" "$(TargetDir)"
copy /Y "$(ImageMagickDir)VisualMagick\bin\CORE_DB_xlib_.dll" "$(TargetDir)"
copy /Y "$(ImageMagickDir)VisualMagick\bin\CORE_DB_zlib_.dll" "$(TargetDir)"
Niestety ImageMagick nie wspiera systemu autolinkowania oraz posiada nadzwyczajną ilość bibliotek, więc każdy wymagany plik trzeba dodać ręcznie. Dla konfiguracji runtime
analogicznie (możesz np. skompilować sobie i dodać do swojego projektu ImageMagick statycznie).
Dzięki takiemu podziałowi na pliki, widać które opcje w konfiguracji projektu są od czego i są wymiennie pomiędzy systemami, użytkownikami i projektami (wystarczy sobie wydzielić makro ze ścieżką).
Wielkie dzięki, mam jeszcze parę pytań. Dlaczego kompilujemy zarówno dla Debug jak i Release ? Co to znaczy dla konfiguracji runtime ? Żeby dodać ImageMagick statycznie należy odpalić configure.exe jeszcze raz i zmienić opcje ?