![使用 g++ 時出現 ld 錯誤“/opt/bin/ld:搜尋 /lib/libm.so.6 時跳過不相容的 /lib/libm.so.6”](https://rvso.com/image/83695/%E4%BD%BF%E7%94%A8%20g%2B%2B%20%E6%99%82%E5%87%BA%E7%8F%BE%20ld%20%E9%8C%AF%E8%AA%A4%E2%80%9C%2Fopt%2Fbin%2Fld%EF%BC%9A%E6%90%9C%E5%B0%8B%20%2Flib%2Flibm.so.6%20%E6%99%82%E8%B7%B3%E9%81%8E%E4%B8%8D%E7%9B%B8%E5%AE%B9%E7%9A%84%20%2Flib%2Flibm.so.6%E2%80%9D.png)
當我嘗試測試編譯一個非常簡單的程式時遇到此錯誤:
#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 等中。 、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