PDA

Visualizza la versione completa : [C++] Linker error nell'uso delle librerie ImageMagick


rcozzi
02-03-2007, 17:18
Ho un problema nell'utilizzare un semplice programma in C che fa uso delle librerie ImageMagick usando il DevC++ ed il Glade per Windows (Gkk)
Dopo aver installato le librerie ImageMagick-6.3.2-9-Q8-windows-dll.exe nel mio Windows2000, nel sorgente ho inserito l'include:

#include <gtk/gtk.h>

#include <magick/MagickCore.h>
#include <wand/MagickWand.h>
......
.....

MagickWandGenesis();
InitializeMagick((gchar *)NULL);

mentre nelle opzioni di compilazione ho inserito i due percorsi per le librerie statiche:

C:\Programmi\ImageMagick-6.3.2-Q8\lib
C:\Programmi\ImageMagick-6.3.2-Q8\include

A questo punto ho inserito sul sorgente C un paio di funzioni che fanno uso di queste librerie per fare un test,
quindi ho lanciato la compilazione.
L'errore generato e nel linkaggio degli oggetti:

[Linker error] undefined reference to `InitializeMagick'
[Linker error] undefined reference to `MagickWandGenesis'
ld returned 1 exit status
C:\Gtk_doc\Projects\project1\devcpp\Makefile.win [Build Error] [project1.exe] Error 1

Controllando il Makefile.win generato automaticamente dal DevC++ non mi sembra di riscontrare dei problemi:

--------------------------------------------------------------------------

# Project: project1
# Makefile created by Dev-C++ 4.9.9.2

CPP = g++.exe
CC = gcc.exe
WINDRES = windres.exe
RES =
OBJ = ../src/main.o ../src/callbacks.o ../src/interface.o ../src/support.o ../src/logics.o $(RES)
LINKOBJ = ../src/main.o ../src/callbacks.o ../src/interface.o ../src/support.o ../src/logics.o $(RES)
LIBS = -L"C:/Dev-Cpp/lib" -L"C:/Programmi/ImageMagick-6.3.2-Q8/lib" -mwindows -L"$(GTK_BASEPATH)/lib" -lgtk-win32-2.0 -lgdk-win32-2.0 -latk-1.0 -lgdk_pixbuf-2.0 -lpangowin32-1.0 -lgdi32 -lpango-1.0 -lgobject-2.0 -lgmodule-2.0 -lglib-2.0 -lintl -liconv
INCS = -I"C:/Dev-Cpp/include" -I"C:/Programmi/ImageMagick-6.3.2-Q8/include" -I"."
CXXINCS = -I"C:/Dev-Cpp/lib/gcc/mingw32/3.4.2/include" -I"C:/Dev-Cpp/include/c++/3.4.2/backward" -I"C:/Dev-Cpp/include/c++/3.4.2/mingw32" -I"C:/Dev-Cpp/include/c++/3.4.2" -I"C:/Dev-Cpp/include" -I"."
BIN = project1.exe
CXXFLAGS = $(CXXINCS) -mms-bitfields -mwindows -DHAVE_CONFIG_H -I"$(GTK_BASEPATH)/include/gtk-2.0" -I"$(GTK_BASEPATH)/lib/gtk-2.0/include" -I"$(GTK_BASEPATH)/include/atk-1.0" -I"$(GTK_BASEPATH)/include/pango-1.0" -I"$(GTK_BASEPATH)/include/glib-2.0" -I"$(GTK_BASEPATH)/lib/glib-2.0/include" -I"$(GTK_BASEPATH)/include/cairo" -I"$(GTK_BASEPATH)/include" -DPACKAGE_PREFIX=\"\" -DPACKAGE_DATA_DIR=\"\" -DPACKAGE_LOCALE_DIR=\"\"
CFLAGS = $(INCS) -mms-bitfields -mwindows -DHAVE_CONFIG_H -I"$(GTK_BASEPATH)/include/gtk-2.0" -I"$(GTK_BASEPATH)/lib/gtk-2.0/include" -I"$(GTK_BASEPATH)/include/atk-1.0" -I"$(GTK_BASEPATH)/include/pango-1.0" -I"$(GTK_BASEPATH)/include/glib-2.0" -I"$(GTK_BASEPATH)/lib/glib-2.0/include" -I"$(GTK_BASEPATH)/include/cairo" -I"$(GTK_BASEPATH)/include" -DPACKAGE_PREFIX=\"\" -DPACKAGE_DATA_DIR=\"\" -DPACKAGE_LOCALE_DIR=\"\"
RM = rm -f

.PHONY: all all-before all-after clean clean-custom

all: all-before project1.exe all-after


clean: clean-custom
${RM} $(OBJ) $(BIN)

$(BIN): $(OBJ)
$(CC) $(LINKOBJ) -o "project1.exe" $(LIBS)

../src/main.o: ../src/main.c
$(CC) -c ../src/main.c -o ../src/main.o $(CFLAGS)

../src/callbacks.o: ../src/callbacks.c
$(CC) -c ../src/callbacks.c -o ../src/callbacks.o $(CFLAGS)

../src/interface.o: ../src/interface.c
$(CC) -c ../src/interface.c -o ../src/interface.o $(CFLAGS)

../src/support.o: ../src/support.c
$(CC) -c ../src/support.c -o ../src/support.o $(CFLAGS)

../src/logics.o: ../src/logics.c
$(CC) -c ../src/logics.c -o ../src/logics.o $(CFLAGS)


---------------------------------------------------------------------------------------------------

Qualcuno mi sa aiutare e dirmi dove sto sbagliando?
Grazie in anticipo.

rcozzi
09-03-2007, 15:12
Mi stata suggerita una soluzione che si rivelata efficace:
bastato aggiungere alla linea di comando del linker:


-lCORE_RL_wand_ -lCORE_RL_magick_ (senza estensioni)


che si riferiscono alle librerie:


CORE_RL_wand_.lib
CORE_RL_magick_.lib


e tutto funziona.
Grazie a tutti.

Loading