Bibliotecas incompatíveis ao tentar compilar um programa que escrevi

1

Eu não sou um falante nativo, mas vou tentar o meu melhor em inglês.

Para um programa self-made, eu preciso de algumas bibliotecas (que são de outra pessoa). No meu primeiro Linux, funcionou, mas agora neste PC não funciona. Eu instalo os programas com sudo make , e as bibliotecas são copiadas para /usr/local/lib/ .

Agora eu tento compilar meu programa com g++ -g -o cv countvertices.c -lQuantim4 -lm -ltiff -lPSgraf3 e ele diz:

/usr/bin/ld: skipping incompatible /usr/local/lib/libQuantim4.a when searching for -lQuantim4
/usr/bin/ld: cannot find -lQuantim4
/usr/bin/ld: skipping incompatible /usr/local/lib/libPSgraf3.a when searching for -lPSgraf3
/usr/bin/ld: cannot find -lPSgraf3
collect2: ld gab 1 als Ende-Status zurück

Eu procurei um pouco sobre essa mensagem de erro, e parece que tem algo a ver com as versões 32/64-bit. O processador é o Processador AMD Athlon (tm) II X2 215 × 2. Eu instalei o Ubuntu 11.10. versão desktop (i386) com o instalador do Windows wubi. Então agora eu tenho uma versão de 32 bits do Ubuntu.

Alguém tem uma ideia de como resolver esse problema? Ou existe uma maneira de ver se as bibliotecas são de 32 ou 64 bits?

Obrigado pela sua resposta, steabert.

A arquitetura da biblioteca é x86_64. Mas eu pensei que se eu executasse o makefile, a arquitetura apropriada seria criada. O makefile para o Quantim4 se parece com isto:

# make
#
#
#  Quantim library (version 2.0)
#
NAME   = libQuantim4
#
VPATH = /usr/include
#
CC = g++
#
#  source files
#
CFILES = SavePaletteImage.c SaveShiftImage.c SetFrame.c StretchHisto.c bAddition.c bContour.c bErode.c bLogAnd.c bLogOr.c bObjects.c gBibin.c gBin.c gBilevel.c gBinTwoLevel.c gErode.c b2DEuler.c pDisector.c BtdErode.c BtdErodeFilter.c BtdOpen.c  BtdContinuity.c SetBtdShell.c  DLine.c bContourCent.c  RGBtoGray.c  StretchRGBHisto.c StretchRGBBright.c ran3.c  GetRandDDDImage.c  CreateDDDImage.c gDiff.c error.c DddMinMax.c DddBin.c DddClas.c BtdEuler.c DddHisto.c DddCircHisto.c DddEulerFunc.c psPlot.c psDddCircHisto.c qdefault.c GetCorDDDImage.c grf3.c GetDddGreyCdf.c psMultiPlot.c gLaplace.c gSobel.c gHisto.c psHisto.c bThinning.c  bConCom.c bHitMiss.c  DddResRed.c GetDddAcov.c gRedRes.c BtdVolSurf.c BtdSkelet.c BtdDiffusionZ.c BtdEuler26.c BtdEuler6.c BtdMeancurv.c BtdQuant.c BtdSurfdens.c BtdVoldens.c GetAcov.c GetCorImage.c  GetGreyCdf.c MinMaxf.c gConfunc.c bConCom2.c gCircMask.c bRemObjects.c GetCorDDDImage2.c Btd2Ddd.c grf2ext.c GetSemiVar.c psMultiPlotTit.c psPlotTit.c utils.c GetVoronoiTes.c GetPercolClus.c bQuant.c bEuler4.c bEuler8.c bLengthdens.c bSurfdens.c bVoldens.c bAverageCurvature.c DddBibin.c gHistoMatch.c rgb-utils.c BtdQuantMask.c bQuantMask.c bQuantRecMask.c  bErodeMark.c bGetDistMap.c BtdDrawSphere.c BtdErodeMir.c BtdGetDistMap.c BtdGetDistOpenMap.c DDD2Dx.c DddDrawCylinder.c DddWaterShed.c gWaterShed.c SetDddShell.c bErodeMir.c bErodeMirCirc.c bGetDistOpenMap.c bThinning8.c BtdGetDistOpenMapDouble.c BtdErodeMirDouble.c ps3Dview.c GetRandImage.c files.c pixelrw.c transforms.c filters.c mathmorph.c bGetFullDistMap.c evaluations.c binarization.c Erode_Open.c greyscale.c minkowski.c binimages.c CircMask.c bConLength.c\
    ${NULL}
# 
#  compiler flags 
# 
CFLAGS = -O3 -w -r -L/usr/lib -L ~/local/lib -I ~/local/include 
#
#  rules 
# 
SRCFILES = $(CFILES)  
OBJFILES = $(CFILES:%.c=../bin/%.o) 

$(NAME): compile createLibrary;

compile: $(OBJFILES) 
#   touch emptyfile
#   $(CC) -o $@ $(CFLAGS) $(OBJFILES) -ltiff -lm

$(OBJFILES): ../bin/%.o: %.c
    $(CC) -c $(CFLAGS) $< -o $@
createLibrary:
    ar r libQuantim4.a $(OBJFILES) 
    ranlib libQuantim4.a
    cp libQuantim4.a /usr/local/lib/libQuantim4.a
    cp quantim4.h /usr/local/include/
clean:
    rm -f ../bin/*.o

Se eu rodar isso com o "sudo make", por que eu recebo uma biblioteca x86_64 quando eu tenho o i386?

O log quando tento compilar como usuário normal:

make | tee build.log
ar: creating libQuantim4.a
ar r libQuantim4.a ../bin/SavePaletteImage.o ../bin/SaveShiftImage.o ../bin/SetFrame.o ../bin/StretchHisto.o ../bin/bAddition.o ../bin/bContour.o ../bin/bErode.o ../bin/bLogAnd.o ../bin/bLogOr.o ../bin/bObjects.o ../bin/gBibin.o ../bin/gBin.o ../bin/gBilevel.o ../bin/gBinTwoLevel.o ../bin/gErode.o ../bin/b2DEuler.o ../bin/pDisector.o ../bin/BtdErode.o ../bin/BtdErodeFilter.o ../bin/BtdOpen.o ../bin/BtdContinuity.o ../bin/SetBtdShell.o ../bin/DLine.o ../bin/bContourCent.o ../bin/RGBtoGray.o ../bin/StretchRGBHisto.o ../bin/StretchRGBBright.o ../bin/ran3.o ../bin/GetRandDDDImage.o ../bin/CreateDDDImage.o ../bin/gDiff.o ../bin/error.o ../bin/DddMinMax.o ../bin/DddBin.o ../bin/DddClas.o ../bin/BtdEuler.o ../bin/DddHisto.o ../bin/DddCircHisto.o ../bin/DddEulerFunc.o ../bin/psPlot.o ../bin/psDddCircHisto.o ../bin/qdefault.o ../bin/GetCorDDDImage.o ../bin/grf3.o ../bin/GetDddGreyCdf.o ../bin/psMultiPlot.o ../bin/gLaplace.o ../bin/gSobel.o ../bin/gHisto.o ../bin/psHisto.o ../bin/bThinning.o ../bin/bConCom.o ../bin/bHitMiss.o ../bin/DddResRed.o ../bin/GetDddAcov.o ../bin/gRedRes.o ../bin/BtdVolSurf.o ../bin/BtdSkelet.o ../bin/BtdDiffusionZ.o ../bin/BtdEuler26.o ../bin/BtdEuler6.o ../bin/BtdMeancurv.o ../bin/BtdQuant.o ../bin/BtdSurfdens.o ../bin/BtdVoldens.o ../bin/GetAcov.o ../bin/GetCorImage.o ../bin/GetGreyCdf.o ../bin/MinMaxf.o ../bin/gConfunc.o ../bin/bConCom2.o ../bin/gCircMask.o ../bin/bRemObjects.o ../bin/GetCorDDDImage2.o ../bin/Btd2Ddd.o ../bin/grf2ext.o ../bin/GetSemiVar.o ../bin/psMultiPlotTit.o ../bin/psPlotTit.o ../bin/utils.o ../bin/GetVoronoiTes.o ../bin/GetPercolClus.o ../bin/bQuant.o ../bin/bEuler4.o ../bin/bEuler8.o ../bin/bLengthdens.o ../bin/bSurfdens.o ../bin/bVoldens.o ../bin/bAverageCurvature.o ../bin/DddBibin.o ../bin/gHistoMatch.o ../bin/rgb-utils.o ../bin/BtdQuantMask.o ../bin/bQuantMask.o ../bin/bQuantRecMask.o ../bin/bErodeMark.o ../bin/bGetDistMap.o ../bin/BtdDrawSphere.o ../bin/BtdErodeMir.o ../bin/BtdGetDistMap.o ../bin/BtdGetDistOpenMap.o ../bin/DDD2Dx.o ../bin/DddDrawCylinder.o ../bin/DddWaterShed.o ../bin/gWaterShed.o ../bin/SetDddShell.o ../bin/bErodeMir.o ../bin/bErodeMirCirc.o ../bin/bGetDistOpenMap.o ../bin/bThinning8.o ../bin/BtdGetDistOpenMapDouble.o ../bin/BtdErodeMirDouble.o ../bin/ps3Dview.o ../bin/GetRandImage.o ../bin/files.o ../bin/pixelrw.o ../bin/transforms.o ../bin/filters.o ../bin/mathmorph.o ../bin/bGetFullDistMap.o ../bin/evaluations.o ../bin/binarization.o ../bin/Erode_Open.o ../bin/greyscale.o ../bin/minkowski.o ../bin/binimages.o ../bin/CircMask.o ../bin/bConLength.o  
ranlib libQuantim4.a
cp libQuantim4.a /usr/local/lib/libQuantim4.a
cp: reguläre Datei „/usr/local/lib/libQuantim4.a“ kann nicht angelegt werden: Keine Berechtigung
make: *** [createLibrary] Fehler 1

O conteúdo do build.log:

ar r libQuantim4.a ../bin/SavePaletteImage.o ../bin/SaveShiftImage.o ../bin/SetFrame.o ../bin/StretchHisto.o ../bin/bAddition.o ../bin/bContour.o ../bin/bErode.o ../bin/bLogAnd.o ../bin/bLogOr.o ../bin/bObjects.o ../bin/gBibin.o ../bin/gBin.o ../bin/gBilevel.o ../bin/gBinTwoLevel.o ../bin/gErode.o ../bin/b2DEuler.o ../bin/pDisector.o ../bin/BtdErode.o ../bin/BtdErodeFilter.o ../bin/BtdOpen.o ../bin/BtdContinuity.o ../bin/SetBtdShell.o ../bin/DLine.o ../bin/bContourCent.o ../bin/RGBtoGray.o ../bin/StretchRGBHisto.o ../bin/StretchRGBBright.o ../bin/ran3.o ../bin/GetRandDDDImage.o ../bin/CreateDDDImage.o ../bin/gDiff.o ../bin/error.o ../bin/DddMinMax.o ../bin/DddBin.o ../bin/DddClas.o ../bin/BtdEuler.o ../bin/DddHisto.o ../bin/DddCircHisto.o ../bin/DddEulerFunc.o ../bin/psPlot.o ../bin/psDddCircHisto.o ../bin/qdefault.o ../bin/GetCorDDDImage.o ../bin/grf3.o ../bin/GetDddGreyCdf.o ../bin/psMultiPlot.o ../bin/gLaplace.o ../bin/gSobel.o ../bin/gHisto.o ../bin/psHisto.o ../bin/bThinning.o ../bin/bConCom.o ../bin/bHitMiss.o ../bin/DddResRed.o ../bin/GetDddAcov.o ../bin/gRedRes.o ../bin/BtdVolSurf.o ../bin/BtdSkelet.o ../bin/BtdDiffusionZ.o ../bin/BtdEuler26.o ../bin/BtdEuler6.o ../bin/BtdMeancurv.o ../bin/BtdQuant.o ../bin/BtdSurfdens.o ../bin/BtdVoldens.o ../bin/GetAcov.o ../bin/GetCorImage.o ../bin/GetGreyCdf.o ../bin/MinMaxf.o ../bin/gConfunc.o ../bin/bConCom2.o ../bin/gCircMask.o ../bin/bRemObjects.o ../bin/GetCorDDDImage2.o ../bin/Btd2Ddd.o ../bin/grf2ext.o ../bin/GetSemiVar.o ../bin/psMultiPlotTit.o ../bin/psPlotTit.o ../bin/utils.o ../bin/GetVoronoiTes.o ../bin/GetPercolClus.o ../bin/bQuant.o ../bin/bEuler4.o ../bin/bEuler8.o ../bin/bLengthdens.o ../bin/bSurfdens.o ../bin/bVoldens.o ../bin/bAverageCurvature.o ../bin/DddBibin.o ../bin/gHistoMatch.o ../bin/rgb-utils.o ../bin/BtdQuantMask.o ../bin/bQuantMask.o ../bin/bQuantRecMask.o ../bin/bErodeMark.o ../bin/bGetDistMap.o ../bin/BtdDrawSphere.o ../bin/BtdErodeMir.o ../bin/BtdGetDistMap.o ../bin/BtdGetDistOpenMap.o ../bin/DDD2Dx.o ../bin/DddDrawCylinder.o ../bin/DddWaterShed.o ../bin/gWaterShed.o ../bin/SetDddShell.o ../bin/bErodeMir.o ../bin/bErodeMirCirc.o ../bin/bGetDistOpenMap.o ../bin/bThinning8.o ../bin/BtdGetDistOpenMapDouble.o ../bin/BtdErodeMirDouble.o ../bin/ps3Dview.o ../bin/GetRandImage.o ../bin/files.o ../bin/pixelrw.o ../bin/transforms.o ../bin/filters.o ../bin/mathmorph.o ../bin/bGetFullDistMap.o ../bin/evaluations.o ../bin/binarization.o ../bin/Erode_Open.o ../bin/greyscale.o ../bin/minkowski.o ../bin/binimages.o ../bin/CircMask.o ../bin/bConLength.o  
ranlib libQuantim4.a
cp libQuantim4.a /usr/local/lib/libQuantim4.a

A arquitetura da biblioteca:

objdump -a /usr/local/lib/libQuantim4.a
In archive /usr/local/lib/libQuantim4.a:

SavePaletteImage.o:     file format elf64-x86-64
rw------- 1000/1000   4248 Jan 16 21:33 2011 SavePaletteImage.o


SaveShiftImage.o:     file format elf64-x86-64
rw------- 1000/1000   2280 Jan 16 21:33 2011 SaveShiftImage.o
...

Mas espere um momento, x86 significa 32 bits, certo? E o i386 também é de 32 bits. Então, onde está o problema?

    
por Johannes 15.01.2012 / 12:57

2 respostas

1

Eu finalmente resolvi o problema instalando o Ubuntu 11.10. amd64, embora eu desejasse que houvesse uma maneira melhor ...

    
por Johannes 25.01.2012 / 19:51
0

Para descobrir em qual arquitetura o arquivo da biblioteca foi compilado, execute o comando

$ objdump -a /usr/local/lib/libQuantim4.a

A arquitetura de destino do archive da biblioteca precisa corresponder à arquitetura dos arquivos de objeto que você está produzindo ao compilar. Suas opções:

  1. Obtenha arquivos de biblioteca para a arquitetura correta ou recompile a biblioteca.
  2. Faça a compilação cruzada para a mesma arquitetura da sua biblioteca.

A segunda opção exigirá que todas as bibliotecas necessárias estejam disponíveis na arquitetura de destino (por exemplo, libc), e o código resultante não será executado sob essa instalação do Ubuntu. Então, se a intenção é executá-lo no Ubuntu i386, eu escolheria a primeira opção.

Se a arquitetura de destino da biblioteca for x86_64 e você não puder obter a biblioteca para i386, poderá instalar o Ubuntu 64bit.

    
por steabert 15.01.2012 / 19:02