我正在使用 clang 在 64 位 ubuntu 22.04 上编译 32 位程序。链接器失败/usr/bin/ld: cannot find -lstdc++: No such file or directory
。
没有文件/没有符号链接/usr/lib32/libstdc++.so
(请参阅下面的搜索路径)。
如果我手动创建像这样的链接sudo ln -s /usr/lib32/libstdc++.so.6 /usr/lib32/libstdc++.so
,它会成功编译。
现在我想知道是否有任何提供符号链接的包或者我是否需要其他参数?
感谢您的帮助。
这是详细的 clang 输出:
/usr/bin/clang -o test test.pic.o stub.pic.o libutest.a libmain.a \
-lm -lstdc++ \
--target=i386-linux-gnu \
-v
Ubuntu clang version 14.0.0-1ubuntu1.1
Target: i386-unknown-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/11
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/9
Selected GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/11
Candidate multilib: .;@m64
Candidate multilib: 32;@m32
Candidate multilib: x32;@mx32
Selected multilib: 32;@m32
"/usr/bin/ld" -pie -z relro --hash-style=gnu --build-id --eh-frame-hdr -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o test /usr/bin/../lib/gcc/x86_64-linux-gnu/11/../../../../lib32/Scrt1.o /usr/bin/../lib/gcc/x86_64-linux-gnu/11/../../../../lib32/crti.o /usr/bin/../lib/gc
c/x86_64-linux-gnu/11/32/crtbeginS.o -L/usr/bin/../lib/gcc/x86_64-linux-gnu/11/32 -L/usr/bin/../lib/gcc/x86_64-linux-gnu/11/../../../../lib32 -L/lib/../lib32 -L/usr/l
ib/../lib32 -L/usr/lib/llvm-14/bin/../lib -L/lib -L/usr/lib --whole-archive /usr/lib/llvm-14/lib/clang/14.0.0/lib/linux/libclang_rt.asan_static-i386.a --no-whole-arch
ive --whole-archive /usr/lib/llvm-14/lib/clang/14.0.0/lib/linux/libclang_rt.asan-i386.a --no-whole-archive --export-dynamic test.pic.o stub.pic.o libutest.a libmain.a -lm -lstdc++ --no-as-needed -lpthread -lrt -lm -ldl -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/bin/../lib
/gcc/x86_64-linux-gnu/11/32/crtendS.o /usr/bin/../lib/gcc/x86_64-linux-gnu/11/../../../../lib32/crtn.o
/usr/bin/ld: cannot find -lstdc++: No such file or directory
搜索路径规范化:
/lib
/lib32
/usr/lib
/usr/lib/gcc/x86_64-linux-gnu/11/32
/usr/lib/llvm-14/lib
/usr/lib32
答案1
包裹lib32stdc++6提供实际的 32 位库,例如,/usr/lib32/libstdc++.so.6.0.30
但是如果 clang 使用 GNUld
作为链接器,它将期望找到一个符号链接,/usr/lib/gcc/x86_64-linux-gnu/NN/32/libstdc++.so
其中NN
是 clang 选择的 GCC 版本。此链接由相应的lib32stdc++-NN-dev包裹。
因此
Selected GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/11
您需要安装lib32stdc++6
和lib32stdc++-11-dev
。然而最好安装g++-多库gcc-11
依赖包,它将自动安装默认编译器(即)的包。