/usr/bin/ld: 在搜索foo时跳过不兼容的foo.so文件

24

我正在使用Ubuntu 13.10 64位版本,并在编译vlfeat库的Python封装程序时遇到以下错误。

g++ -o _vlfeat.so ../../vl/aib.o ../../vl/generic.o ../../vl/hikmeans.o ../../vl/ikmeans.o ../../vl/imopv.o ../../vl/mathop.o ../../vl/pgm.o ../../vl/rodrigues.o ../../vl/stringop.o ../../vl/getopt_long.o ../../vl/host.o ../../vl/imop.o ../../vl/imopv_sse2.o ../../vl/mser.o ../../vl/random.o ../../vl/sift.o ../../vl/dsift.o mser/vl_erfill.o mser/vl_mser.o sift/vl_sift.o sift/vl_dsift.o sift/vl_siftdescriptor.o imop/vl_imsmooth.o misc/vl_binsum.o kmeans/vl_hikmeans.o kmeans/vl_ikmeans.o kmeans/vl_hikmeanspush.o kmeans/vl_ikmeanspush.o py_vlfeat.o -m64 -msse -m32 -msse -shared  -lboost_python-mt-py27
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.7/../../../libboost_python-mt-py27.so when searching for -lboost_python-mt-py27
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.7/../../../libboost_python-mt-py27.a when searching for -lboost_python-mt-py27
/usr/bin/ld: skipping incompatible /usr/lib/libboost_python-mt-py27.so when searching for -lboost_python-mt-py27
/usr/bin/ld: skipping incompatible /usr/lib/libboost_python-mt-py27.a when searching for -lboost_python-mt-py27
/usr/bin/ld: cannot find -lboost_python-mt-py27
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.7/libstdc++.so when searching for -lstdc++
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.7/libstdc++.a when searching for -lstdc++
/usr/bin/ld: cannot find -lstdc++
/usr/bin/ld: skipping incompatible /usr/lib/x86_64-linux-gnu/libm.so when searching for -lm
/usr/bin/ld: skipping incompatible /usr/lib/x86_64-linux-gnu/libm.a when searching for -lm
/usr/bin/ld: cannot find -lm
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.7/libgcc_s.so when searching for -lgcc_s
/usr/bin/ld: cannot find -lgcc_s
/usr/bin/ld: skipping incompatible /usr/lib/x86_64-linux-gnu/libc.so when searching for -lc
/usr/bin/ld: skipping incompatible /usr/lib/x86_64-linux-gnu/libc.a when searching for -lc
/usr/bin/ld: cannot find -lc
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.7/libgcc_s.so when searching for -lgcc_s
/usr/bin/ld: cannot find -lgcc_s
collect2: error: ld returned 1 exit status
make: *** [_vlfeat.so] Error 1

有没有办法让这个库在64位架构上工作?


7
你同时指定了-m32-m64选项...你想使用哪个?请做出选择。 - Markku K.
1
-m32 生成32位代码,而-m64 生成64位代码(这应该是您系统上的默认设置)。如果需要,您只需指定其中一个。您可以在系统上运行32位或64位可执行文件,但32位可执行文件链接32位库,而64位可执行文件链接64位库。您是通过编译源代码生成.o文件,还是从其他地方获取的? - Markku K.
嗯,我不了解那个库或代码,但你可以尝试从LDFLAGS中删除“-m32”。然后应该执行“make clean”,接着再执行“make”。 - Markku K.
@MarkkuK.:非常感谢。我会尝试一下并告诉您结果。 - user1403483
@Ankit:你试过错误提示中说的吗?即在Makefile中的每个目标上添加shove -fPIC。 - kirbyfan64sos
显示剩余6条评论
1个回答

16

移除命令行标志中的 -m32

若要构建 32 位二进制文件,需要安装 sudo apt-get install gcc-multilibsudo apt-get install ia32-libs-dev


“sudo apt-get install gcc-multilib”是一个Linux的技巧。在Windows上有类似的技巧吗?(我在Windows 7上遇到了相同的链接问题) - Fennekin
4
E: 包 'ia32-libs-dev' 没有安装候选项。 - user
在我的Debian Jessie上,sudo apt-get install gcc-multilib解决了这个问题。 - jitter
如果你正在构建的项目中包含任何C++部分,那么还需要一个g++-multilib软件包 - 因此在Ubuntu 16.04上,我需要 'sudo apt-get install gcc-multilib g++-multilib'。 - Michael Firth
1
我正在为树莓派进行交叉编译Qt。我正在使用arm-linux-gnueabihf-,这是我通过sudo apt install crossbuild-essential-armhf安装的。您的答案帮助我使用以下命令构建了QtWebEngine:sudo apt-get install lib32z1-dev,因为我没有32位zlib。 - Mohammad Rahimi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接