Errore di collegamento Magick ++
-
27-10-2019 - |
Domanda
Ho qui un semplice codice di conversione di immagini che utilizza la libreria Magick ++ (interfaccia ImageMagick). (IDE Eclipse)
#include <Magick++.h>
#include <string>
#include <iostream>
using namespace std;
using namespace Magick;
int main(int argc,char **argv)
{
Image image;
image.read("/home/usr1/test.tiff");
image.write( "/home/usr1/test.bmp" );
return 0;
}
Sto facendo una compilazione incrociata con target arm-linux.Il codice viene compilato correttamente, ma nella parte di collegamento, ho ricevuto errori di riferimento non definiti.
/usr/local/lib/libMagick++/libMagickCore.a(dlopen.o)(.text+0x144): In function `vm_open':
ltdl/loaders/dlopen.c:194: undefined reference to `dlopen'
/usr/local/lib/libMagick++/libMagickCore.a(dlopen.o)(.text+0x158):ltdl/loaders/dlopen.c:198: undefined reference to `dlerror'
/usr/local/lib/libMagick++/libMagickCore.a(dlopen.o)(.text+0x16c): In function `vm_close':
ltdl/loaders/dlopen.c:212: undefined reference to `dlclose'
/usr/local/lib/libMagick++/libMagickCore.a(dlopen.o)(.text+0x17c):ltdl/loaders/dlopen.c:214: undefined reference to `dlerror'
/usr/local/lib/libMagick++/libMagickCore.a(dlopen.o)(.text+0x198): In function `vm_sym':
ltdl/loaders/dlopen.c:227: undefined reference to `dlsym'
/usr/local/lib/libMagick++/libMagickCore.a(dlopen.o)(.text+0x1ac):ltdl/loaders/dlopen.c:231: undefined reference to `dlerror'
Ho usato il seguente comando per compilare il codice:
/opt/Mx800SDK/vfitc/cross/bin/arm-linux-g++ -DMx870 -I/opt/Mx800SDK/vfitc/cross/arm-linux/include -I/usr/local/include/ImageMagick -I/opt/Mx800SDK/include -O2 -Wall -c -fmessage-length=0 -fno-strict-aliasing -o'main.o' '../main.cpp'
e al collegamento:
/opt/Mx800SDK/vfitc/cross/bin/arm-linux-g++ -L/opt/Mx800SDK/lib -L/usr/local/lib/libMagick++ -o'imgConverter' ./main.o -lpthread -lMagick++ -lMagickWand -lMagickCore -ltiff -lz
C'è qualche altra libreria di cui ho bisogno per collegarla correttamente?Lo sto collegando bene?Grazie in anticipo.
Soluzione
Prova a invertire le librerie Magick, aggiungi la libreria MagickWand
(e metti libz e altre librerie di immagini di base alla fine e la libreria del linker dinamico mentre ci sei):
... -lpthread -lMagick++ -lMagickWand -lMagickCore -lz -ldl
Vedi Linker Order - GCC per sapere perché l'ordine delle librerie statiche è importante.