当我尝试测试编译一个非常简单的程序时遇到此错误:
#ifdef __cplusplus
extern "C"
#endif
int
main ()
{
return 0;
}
如果我使用 g++ 编译,我收到以下错误消息:
g++ -o conftest -I/opt/include -L/opt/lib -Wl,--library-path=opt/lib testconftest.cpp
/opt/bin/ld: skipping incompatible /lib/libm.so.6 when searching for /lib/libm.so.6
/opt/bin/ld: cannot find /lib/libm.so.6
/opt/bin/ld: cannot find /lib/libmvec.so.1
但是gcc会编译通过:
gcc -o conftest -I/opt/include -L/opt/lib -Wl,--library-path=opt/lib testconftest.cpp
请注意,系统是 32 位和 64 位的混合体,所有 32 位程序和库都位于 /lib、/bin 、/sbin 等中。所有 64 位程序和库都位于 /opt/lib、/opt/bin、opt/sbin 等中我知道 /lib/libm.so.6 将是错误的版本,更正的版本位于 /opt/lib 中。另外,gcc、g++、ld 都是 64 位的,位于 /opt 子文件夹中,并且已经使用 gcc 成功编译了其他复杂的程序。文件 /lib/libm.so.6 是 /lib/libm-2.6.1.so 的符号链接;文件 /opt/lib/lim.so.6 是 /opt/lib/libm-2.22.so* 的符号链接
file /opt/lib/libm-2.22.so
/opt/lib/libm-2.22.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, for GNU/Linux 2.6.32, stripped
file /lib/libm-2.6.1.so
/lib/libm-2.6.1.so: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.6.8, stripped
g++ --version
g++ (OpenWrt GCC 4.8.5) 4.8.5
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
答案1
由于我无法重现您遇到的问题,所以我只能给您一些建议。
看看这个回答,因为 usingg++
在链接器阶段自动添加一些额外的库。您可以-v
在编译/链接时使用该选项来更清楚地了解所包含的库。
-v
打印(在标准错误输出上)运行编译阶段所执行的命令。还打印编译器驱动程序、预处理器和编译器本身的版本号。
当g++
auto 添加libstdc++
到链接器阶段时,请查看它在路径中的声明位置。
$ ldconfig -p | grep stdc++
libstdc++.so.6 (libc6,x86-64) => /usr/lib64/libstdc++.so.6
libstdc++.so.6 (libc6) => /usr/lib/libstdc++.so.6