使用g ++进行链接无法搜索-lstdc ++

jwo*_*ard 24 java-native-interface linker makefile g++ libstdc++

我正在尝试使用别人的Makefile来编译一个非常简单的c ++库.makefile如下:

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
Run Code Online (Sandbox Code Playgroud)

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

...
/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
Run Code Online (Sandbox Code Playgroud)

仅供参考,我在Ubuntu 9.10 64bit上.

Rau*_*naq 77

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

进一步探讨:g ++ - multilib是一个虚拟包,它安装了g ++ 4.6-multilib,后者又安装了相应的libstdc ++.所以在/usr/lib/gcc/x86_64-linux-gnu/4.6/32文件夹下.

  • 说实话!这不仅仅是一次投票.解决了我的问题,当然. (10认同)

jwo*_*ard 18

回答我自己的问题:

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

$ sudo ln -s /usr/lib32/libstdc++.so.6 /usr/lib32/libstdc++.so
Run Code Online (Sandbox Code Playgroud)

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


nos*_*nos 5

看来你正在64位机器上编译32位库,但是不存在32位版本的libstdc ++.

尝试apt-get install ia32-libs libc6-i386 libc6-dev-i386 lib32gcc1 lib32stdc ++ 6

(顺便说一句.你正在生成一个.so,你应该在编译你的.cpp文件时指定-fPIC)