如何在Mac OS X Mavericks上链接std C++库?

3
我正在将一个应用程序移植到OS X Darwin,但出现了链接错误,提示缺少类似以下的符号:
std::__1::basic_string<char, std::__1::char_traits<char>,
                       std::__1::allocator<char> >::find_last_of(char const*,
                                                                 unsigned long,
                                                                 unsigned long) const
operator delete[](void*)
typeinfo for std::runtime_error
std::set_unexpected(void (*)())
std::exception::~exception()
[...]

我希望这些应该来自libstdc++,但我不知道如何使用clang链接它。

这是我尝试的链接行和结果失败的原因:

clang -std=c++11 -stdlib=libc++ -m64 -o ARCH.darwin_1310_i86/release/myExec ARCH.darwin_1310_i86/release/myExec.o ../../src/netcomm/ARCH.darwin_1310_i86/release/libmyExec.a ../../src/common/ARCH.darwin_1310_i86/release/libcommon.a -L../zlib  -lz -L../Botan -lbotan-1.10 -lboost_thread-mt
Undefined symbols for architecture x86_64:
  "std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::find_last_of(char const*, unsigned long, unsigned long) const", referenced from:
[...]

但是这并没有起作用,我没有找到任何正确链接的示例。

我认为你需要使用clang++命令来调用C++编译器和链接器。clang可执行文件是C编译器。 - CPlusPlus OOA and D
我在 Linux 上尝试使用 clang 和 libc++ 构建一个项目时遇到了类似的问题。该项目包含一个与第三方动态库链接的二进制文件,该库是使用 g++ 构建并链接 libstdc++(通过软件包管理器安装)。一旦我摆脱了这个依赖,问题就消失了。 - Dmitry
2个回答

6
您需要像这样在链接行中添加-lc++

clang -std=c++11 -stdlib=libc++ -lc++ -m64 -o ARCH.darwin_1310_i86/release/myExec ARCH.darwin_1310_i86/release/myExec.o ../../src/netcomm/ARCH.darwin_1310_i86/release/libmyExec.a ../../src/common/ARCH.darwin_1310_i86/release/libcommon.a -L../zlib -lz -L../Botan -lbotan-1.10 -lboost_thread-mt

添加后,缺失的符号就会消失。

1
@Rico现在好了吗?这确实解决了我的问题,并且另一个答案中没有提供,关键是要添加“-lc++”,添加“-std=c++11”和“-stdlib=libc++”已经在我的链接行中了,所以另一个答案没有帮助到我。 - WilliamKF

1

我在我的MacBook Pro OS X Mavericks 9.2上使用CLang++编译器,在NetBeans 7.4中进行编程,

-std=c++11 -stdlib=libc++ -Wall

我确定我通过安装最新的Xcode命令行工具获得了libc++库。在我的系统上,动态的libc++库位于/usr/lib目录下。 开始编辑
我刚刚尝试了一个基本的“Hello, World”程序,并确保.xcodeproj中的LLVM 5.0(CLang ++)编译器设置已配置为:
C++ Language Dialect        C++11 [-std=c++11]
C++ Standard Library        libc++ (LLVM C++ Standard library with C++11 support)

C Language Dialect          c11

一切如预期。
编辑结束


在链接行中使用“-std=c++11 -stdlib=libc++”会导致相同的缺失符号。请参见编辑后的问题。 - WilliamKF

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接