2010-01-18 72 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