/ usr / bin / ld: não é possível encontrar o -ldb durante a compilação do iproute2

2

Eu estou tentando compilar o iproute2-3-12-0 no Fedora 19, tenho o BerkeleyDB instalado, o comando ls -la /usr/lib/libdb* fornece os seguintes resultados:

-rwxr-xr-x 1 root root 1847852 May 16  2013 /usr/lib/libdb-5.3.so
lrwxrwxrwx 1 root root      12 Sep 18 20:15 /usr/lib/libdb-5.so -> libdb-5.3.so
lrwxrwxrwx 1 root root      18 Jan  4 12:57 /usr/lib/libdbus-1.so.3 -> libdbus-1.so.3.7.4
-rwxr-xr-x 1 root root  317720 Nov 11 19:24 /usr/lib/libdbus-1.so.3.7.4

Eu tenho a versão mais recente do Bison e do Flex. Eu uso o kernel: 3.12.8-200.fc19.x86_64. Eu tenho ldb em /usr/lib and /usr/lib64 . Eu não encontrei nenhum LDFLAGS em Makefile .

Eu recebo um erro:

ssfilter.y: conflicts: 27 shift/reduce
/usr/bin/ld: cannot find -ldb
collect2: error: ld returned 1 exit status
make[1]: *** [arpd] Error 1
make: *** [all] Error 2

Um exame mais detalhado do fim do log do make revela:

        make[1]: Entering directory '/root/Traffic_Shaping/iproute2-3.12.0/bridge'
gcc -Wall -Wstrict-prototypes  -Wmissing-prototypes -Wmissing-declarations -Wold-style-definition -O2 -I../include -DRESOLVE_HOSTNAMES -DLIBDIR=\"/usr/lib64\" -DCONFDIR=\"/etc/iproute2\" -D_GNU_SOURCE   -c -o bridge.o bridge.c
gcc -Wall -Wstrict-prototypes  -Wmissing-prototypes -Wmissing-declarations -Wold-style-definition -O2 -I../include -DRESOLVE_HOSTNAMES -DLIBDIR=\"/usr/lib64\" -DCONFDIR=\"/etc/iproute2\" -D_GNU_SOURCE   -c -o fdb.o fdb.c
gcc -Wall -Wstrict-prototypes  -Wmissing-prototypes -Wmissing-declarations -Wold-style-definition -O2 -I../include -DRESOLVE_HOSTNAMES -DLIBDIR=\"/usr/lib64\" -DCONFDIR=\"/etc/iproute2\" -D_GNU_SOURCE   -c -o monitor.o monitor.c
gcc -Wall -Wstrict-prototypes  -Wmissing-prototypes -Wmissing-declarations -Wold-style-definition -O2 -I../include -DRESOLVE_HOSTNAMES -DLIBDIR=\"/usr/lib64\" -DCONFDIR=\"/etc/iproute2\" -D_GNU_SOURCE   -c -o link.o link.c
gcc -Wall -Wstrict-prototypes  -Wmissing-prototypes -Wmissing-declarations -Wold-style-definition -O2 -I../include -DRESOLVE_HOSTNAMES -DLIBDIR=\"/usr/lib64\" -DCONFDIR=\"/etc/iproute2\" -D_GNU_SOURCE   -c -o mdb.o mdb.c
gcc -Wall -Wstrict-prototypes  -Wmissing-prototypes -Wmissing-declarations -Wold-style-definition -O2 -I../include -DRESOLVE_HOSTNAMES -DLIBDIR=\"/usr/lib64\" -DCONFDIR=\"/etc/iproute2\" -D_GNU_SOURCE   -c -o vlan.o vlan.c
gcc   bridge.o fdb.o monitor.o link.o mdb.o vlan.o ../lib/libnetlink.a ../lib/libutil.a  ../lib/libnetlink.a ../lib/libutil.a -o bridge
make[1]: Leaving directory '/root/Traffic_Shaping/iproute2-3.12.0/bridge'
make[1]: Entering directory '/root/Traffic_Shaping/iproute2-3.12.0/misc'
gcc -Wall -Wstrict-prototypes  -Wmissing-prototypes -Wmissing-declarations -Wold-style-definition -O2 -I../include -DRESOLVE_HOSTNAMES -DLIBDIR=\"/usr/lib64\" -DCONFDIR=\"/etc/iproute2\" -D_GNU_SOURCE   -c -o ss.o ss.c
bison ssfilter.y -o ssfilter.c
ssfilter.y: conflicts: 27 shift/reduce
gcc -Wall -Wstrict-prototypes  -Wmissing-prototypes -Wmissing-declarations -Wold-style-definition -O2 -I../include -DRESOLVE_HOSTNAMES -DLIBDIR=\"/usr/lib64\" -DCONFDIR=\"/etc/iproute2\" -D_GNU_SOURCE   -c -o ssfilter.o ssfilter.c
gcc   ss.o ssfilter.o  ../lib/libnetlink.a ../lib/libutil.a -o ss
gcc -Wall -Wstrict-prototypes  -Wmissing-prototypes -Wmissing-declarations -Wold-style-definition -O2 -I../include -DRESOLVE_HOSTNAMES -DLIBDIR=\"/usr/lib64\" -DCONFDIR=\"/etc/iproute2\" -D_GNU_SOURCE  -o nstat nstat.c -lm
gcc -Wall -Wstrict-prototypes  -Wmissing-prototypes -Wmissing-declarations -Wold-style-definition -O2 -I../include -DRESOLVE_HOSTNAMES -DLIBDIR=\"/usr/lib64\" -DCONFDIR=\"/etc/iproute2\" -D_GNU_SOURCE  -o ifstat ifstat.c ../lib/libnetlink.a ../lib/libutil.a -lm
gcc -Wall -Wstrict-prototypes  -Wmissing-prototypes -Wmissing-declarations -Wold-style-definition -O2 -I../include -DRESOLVE_HOSTNAMES -DLIBDIR=\"/usr/lib64\" -DCONFDIR=\"/etc/iproute2\" -D_GNU_SOURCE  -o rtacct rtacct.c ../lib/libnetlink.a ../lib/libutil.a -lm
gcc -Wall -Wstrict-prototypes  -Wmissing-prototypes -Wmissing-declarations -Wold-style-definition -O2 -I../include -DRESOLVE_HOSTNAMES -DLIBDIR=\"/usr/lib64\" -DCONFDIR=\"/etc/iproute2\" -D_GNU_SOURCE -I/usr/include/libdb4  -o arpd arpd.c ../lib/libnetlink.a ../lib/libutil.a -ldb -lpthread
/usr/bin/ld: cannot find -ldb
collect2: error: ld returned 1 exit status
make[1]: *** [arpd] Error 1
make[1]: Leaving directory '/root/Traffic_Shaping/iproute2-3.12.0/misc'
make: *** [all] Error 2

Como posso obter ld para encontrar libdb ?

    
por domaniqs 27.01.2014 / 23:23

2 respostas

3

Como @bersh astutely points nos comentários , você parece estar misturando bibliotecas que foram compiladas para arquiteturas diferentes (32 bits versus 64 bits). Nas bibliotecas de 32 bits do Fedora, vá em /usr/lib , enquanto as bibliotecas de 64 bits vão em /usr/lib64 . Você pode se convencer disso com alguns exemplos.

Exemplo

Vamos escolher uma das bibliotecas de compartilhamento para o resolvedor de DNS, /usr/lib/libresolv-2.17.so . Podemos ver que é parte de um RPM de 32 bits.

$ rpm -qf /usr/lib/libresolv-2.17.so 
glibc-2.17-20.fc19.i686

Você também pode ver que a biblioteca é um arquivo com cabeçalho ELF de 32 bits.

$ file /usr/lib/libresolv-2.17.so
/usr/lib/libresolv-2.17.so: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), BuildID[sha1]=0xeee8b9e6cb49f8dd64059cc158ce2c55f8c6df5b, for GNU/Linux 2.6.32, not stripped

Portanto, é necessário ter cuidado ao compilar seu software para garantir que você tenha as bibliotecas apropriadas no local (32 e 64), bem como os arquivos de cabeçalho correspondentes. No Fedora (e em todas as distros baseadas no Red Hat) os pacotes são nomeados assim:

  • 32 bits - libdb-5.3.21-11.fc19.i686
  • 64 bits - libdb-5.3.21-11.fc19.x86_64
  • arquivos de cabeçalho de 32 bits - libdb-devel-5.3.21-11.fc19.i686
  • arquivos de cabeçalho de 64 bits - libdb-devel-5.3.21-11.fc19.x86_64

Sua biblioteca, libdb

Se você perceber que o arquivo da biblioteca está disponível nas duas arquiteturas. Dada a saída do seu pacote kernel sendo x64, eu suponho que você pretendia instalar as versões de 64 bits das bibliotecas.

Além disso, uma vez que você está tentando compilar, você também vai querer instalar os arquivos de cabeçalho para sua arquitetura.

$ rpm -qf /usr/lib/libdb-5.3.so
libdb-5.3.21-11.fc19.i686
$ rpm -qf /usr/lib64/libdb-5.3.so
libdb-5.3.21-11.fc19.x86_64

Como sei qual pacote instalar?

Se você ver que suas compilações estão chamando por arquivos que você não tem, então você pode usar repoquery para descobrir que pacote (s) fornece vários arquivos assim:

$ repoquery -f '*/libdb-5.3.so'
libdb-0:5.3.21-11.fc19.x86_64
libdb-0:5.3.21-11.fc19.i686
    
por 28.01.2014 / 01:24
0

lib conterá bibliotecas de 32 bits e lib64 64 bits. Eu diria que seu gcc está gerando binários de 64 bits. Portanto, /lib64 ( /usr/lib64 ) precisa ter as bibliotecas db corretas. Você pode executar o comando gcc manualmente com --verbose para ver tudo o que está fazendo. (ou seja, o comando ld está sendo executado)

    
por 28.01.2014 / 01:22

Tags