【问题标题】:Linking using g++ fails searching for -lstdc++使用 g++ 链接无法搜索 -lstdc++
【发布时间】:2011-01-06 08:42:55
【问题描述】:

我正在尝试使用其他人的 Makefile 来编译一个非常简单的 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

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

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

【问题讨论】:

  • 您使用的是哪个版本的 g++ - 执行 'g++ --version' 来找出答案。
  • $ g++ --version g++ (Ubuntu 4.4.1-4ubuntu8) 4.4.1

标签: linker g++ makefile java-native-interface libstdc++


【解决方案1】:

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

进一步探索:g++-multilib 是一个虚拟包,它安装了 g++4.6-multilib,而 g++4.6-multilib 又在 /usr/lib/gcc/x86_64-linux 下安装了适当的 libstdc++.so -gnu/4.6/32 文件夹。

【讨论】:

  • 老实说!这值得一票以上。肯定解决了我的问题。
  • 这解决了我在 Ubuntu 12.04.1 LTS 上构建 32 位版本的 NodeJS 的问题
  • 对于 OpenSuse 用户:sudo zypper install gcc-32bit g++-32bit
  • @Raunaq:谢谢!需要这个来编译 Riak。在您进一步探索之后,您是否会说要安装一个较小的依赖项来解决问题?对此没有任何抱怨,它对我有用:-)
【解决方案2】:

回答我自己的问题:

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

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

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

【讨论】:

【解决方案3】:

您似乎是在 64 位机器上编译 32 位库,但不存在 32 位版本的 libstdc++。

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

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

【讨论】:

  • 我曾想过,但是它们都已安装 - 顺便说一句,感谢 -fPIC 的提醒,我应该明白这一点......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多