Linker 使用g+链接+;无法搜索-lstdc++; 我试图用别人的Mag文件来编译一个非常简单的C++库。生成文件如下所示: JNIFLAGS=-O2 -pthread -I/usr/lib/jvm/java-6-sun/include -I/usr/lib/jvm/java-6-sun/include/linux all: rm -f ../dist/libUtils.so g++ $(JNIFLAGS) -c -m32 -o com_markets_utils_dates_NativeTime.o com_markets_utils_dates_NativeTime.cpp g++ $(JNIFLAGS) -c -m32 -o DateUtil.o DateUtil.cpp g++ -pthread -m32 -shared -fPIC -o ../dist/libUtils.so DateUtil.cpp g++ -pthread -m32 -shared -fPIC -o ../dist/libNativeTime.so DateUtil.o com_markets_utils_dates_NativeTime.o

Linker 使用g+链接+;无法搜索-lstdc++; 我试图用别人的Mag文件来编译一个非常简单的C++库。生成文件如下所示: JNIFLAGS=-O2 -pthread -I/usr/lib/jvm/java-6-sun/include -I/usr/lib/jvm/java-6-sun/include/linux all: rm -f ../dist/libUtils.so g++ $(JNIFLAGS) -c -m32 -o com_markets_utils_dates_NativeTime.o com_markets_utils_dates_NativeTime.cpp g++ $(JNIFLAGS) -c -m32 -o DateUtil.o DateUtil.cpp g++ -pthread -m32 -shared -fPIC -o ../dist/libUtils.so DateUtil.cpp g++ -pthread -m32 -shared -fPIC -o ../dist/libNativeTime.so DateUtil.o com_markets_utils_dates_NativeTime.o,linker,g++,makefile,java-native-interface,libstdc++,Linker,G++,Makefile,Java Native Interface,Libstdc++,这编译得很好,但链接器抱怨: ... /usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.4.1/libstdc++.so when searching for -lstdc++ /usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.4.1/libstdc++.a when searching for -lstdc++ /usr/bin

这编译得很好,但链接器抱怨:

...
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.4.1/libstdc++.so when searching for -lstdc++
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.4.1/libstdc++.a when searching for -lstdc++
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.4.1/libstdc++.so when searching for -lstdc++
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.4.1/libstdc++.a when searching for -lstdc++
/usr/bin/ld: cannot find -lstdc++
collect2: ld returned 1 exit status
make: *** [all] Error 1

仅供参考,我现在使用的是Ubuntu 9.10 64位。

看起来您正在64位机器上编译一个32位库,但是没有32位版本的libstdc++

尝试安装ia32 libs libc6-i386 libc6-dev-i386 lib32gcc1 lib32stdc++6


(顺便说一句,您正在生成一个.cpp文件,所以在编译.cpp文件时也应该指定-fPIC)

回答我自己的问题:

这个解决方案似乎有点像黑客,您需要为库的32位版本创建一个符号链接(在安装@nos的答案中提到的包之后):


完成此操作后,链接器将自动找到要使用的正确库。

发布供将来参考,我找到的一个解决方案是安装g++-multilib。在g++版本4.6.1上,我遇到了与-lstdc++相关的相同的不兼容问题


进一步探究:g++-multilib是一个虚拟软件包,它安装了g++4.6-multilib,而g++4.6-multilib又安装了相应的libstdc++。因此在/usr/lib/gcc/x86_64-linux-gnu/4.6/32文件夹下。

您使用哪个版本的g++-do'g++-version'来查找。$g++-version g++(Ubuntu 4.4.1-4ubuntu8)4.4.1我已经想到了这一点,但它们都已安装-顺便说一句,感谢-fPIC提醒,我应该抓住这一点…老实说!这不仅仅是一次投票。当然,解决了我的问题。这个方法也是推荐的。它解决了我在Ubuntu 12.04.1 LTS上为OpenSuse用户构建32位版本NodeJS的问题:
sudo zypper install gcc-32bit g++-32bit
@Raunaq:谢谢!需要这个来编译Riak。在进一步调查之后,您是否认为需要安装一个较小的依赖项来解决问题?虽然没有抱怨,但它对我有效:-)可能与这个bug有关:(新链接)如果你没有sudo怎么办?
$ sudo ln -s /usr/lib32/libstdc++.so.6 /usr/lib32/libstdc++.so