Ip
/usr/bin/ld: 編譯 iproute2 時找不到 -ldb
我正在嘗試在 Fedora 19 上編譯 iproute2-3-12-0,我安裝了 BerkeleyDB,該命令
ls -la /usr/lib/libdb*
給出以下結果:-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
我有最新版本的 Bison 和 Flex。我使用核心:3.12.8-200.fc19.x86_64。我有 ldb
/usr/lib and /usr/lib64
。雖然我沒有找到任何東西LDFLAGS
。Makefile
我收到一個錯誤:
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
仔細查看 make log 的末尾會發現:
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
我怎樣才能
ld
找到libdb
?
正如@bersh 在評論中敏銳地指出的那樣,您似乎正在混合為不同架構(32 位與 64 位)編譯的庫。在 Fedora 上,32 位庫進入 .
/usr/lib
,而 64 位庫進入/usr/lib64
. 你可以用幾個例子來說服自己。例子
讓我們為 DNS 解析器選擇一個共享庫,
/usr/lib/libresolv-2.17.so
. 我們可以看到它是 32 位 RPM 的一部分。$ rpm -qf /usr/lib/libresolv-2.17.so glibc-2.17-20.fc19.i686
您還可以看到該庫是一個 32 位 ELF 標頭檔。
$ 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
因此,您在編譯軟體時需要小心,以確保您擁有適當的庫(32 和 64)以及相應的標頭檔。在 Fedora(以及所有基於 Red Hat 的發行版)上,軟體包的名稱如下:
- 32 位 - libdb-5.3.21-11.fc19.i686
- 64 位 - libdb-5.3.21-11.fc19.x86_64
- 32 位標頭檔 - libdb-devel-5.3.21-11.fc19.i686
- 64 位標頭檔 - libdb-devel-5.3.21-11.fc19.x86_64
你的圖書館,libdb
如果您注意到庫文件在兩種架構中都可用。鑑於您的
kernel
軟體包的輸出是 x64,我假設您打算安裝 64 位版本的庫。此外,由於您正在嘗試編譯,因此您也需要為您的架構安裝標頭檔。
$ 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
我怎麼知道要安裝什麼包?
如果您看到您的編譯正在呼叫您沒有的文件,那麼您可以使用
repoquery
來找出哪些包提供了各種文件,如下所示:$ repoquery -f '*/libdb-5.3.so' libdb-0:5.3.21-11.fc19.x86_64 libdb-0:5.3.21-11.fc19.i686