2010-01-18 74 views
22

我试图使用别人的Makefile来编译一个非常简单的C++库。生成文件如下:使用g ++链接失败搜索-lstdC++

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 

编译没有问题,但链接器抱怨:

... 
/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位。

+0

您正在使用哪个版本的g ++ - 做'g ++ --version'来找出答案。 – 2010-01-18 12:54:01

+0

$ g ++ --version g ++(Ubuntu 4.4.1-4ubuntu8)4.4.1 – jwoolard 2010-01-18 13:19:51

回答

72

发布以备将来参考,我找到的解决方案是到安装g ++ - multilib。我不得不与-lstdC++上得到的相同的不兼容问题++版本4.6.1

在进一步的探测:克++ - multilib的是其中安装克++ 4.6-multilib的这反过来又安装了适当的的libstdC++伪包,以便。在/usr/lib/gcc/x86_64-linux-gnu/4.6/32文件夹下。

+10

老实说!这值得不止一个投票。当然解决了我的问题。 – zeboidlund 2011-12-27 01:21:46

+1

这种方法也推荐https://bugs.launchpad.net/ubuntu/+source/gcc-4.6/+bug/973240 – Gili 2012-12-24 13:33:19

+0

这解决了我在Ubuntu 12.04.1上构建一个32位版本的NodeJS的问题LTS – ShaneH 2013-01-30 14:34:40

4

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

尝试apt-get的安装IA32-库的libc6-I386的libc6-DEV-I386 lib32gcc1 lib32stdC++ 6

(顺便说一句,你生产。所以,你应该编译你的.cpp时指定-fPIC文件以及)

+1

我想过了,但是它们都安装完毕 - 顺便说一句,感谢-fPIC提醒,我应该抓住那个...... – jwoolard 2010-01-18 13:21:37

18

回答我的问题:

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

$ sudo ln -s /usr/lib32/libstdc++.so.6 /usr/lib32/libstdc++.so 

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

+0

@没有链接已经死了。 – 2013-12-17 19:57:01

+0

可能与此bug有关:https://bugs.launchpad.net/ubuntu/+source/ia32-libs/+bug/360870(新链接) – nos 2013-12-17 20:07:20