【问题标题】:Using c++11 in MacOS X and compiled Boost libraries conundrum在 MacOS X 中使用 c++11 和编译的 Boost 库难题
【发布时间】:2013-08-10 23:22:09
【问题描述】:

我正在尝试编译一个广泛使用 c++11 标准的 c++ 项目。仅使用 -std=c++11 一切顺利,直到我尝试使用 unordered_map 并且 MacOS 在 usr/include 中的任何位置都没有 unordered_map 头文件。

我做了一些研究,发现使用 -stdlib=libc++ 可以解决它(不知道如何解决,如果包含文件不在文件系统中,这对我来说似乎很神奇)。它确实做到了。它编译得很好,但链接器无法链接到我的程序也广泛使用的 boost::program_options。如果没有 -stdlib=libc++,可以完美提升链接,但我会丢失 unordered_map。

我应该怎么做才能使用 Mac OS clang++ 编译器获得最新的 C++11 功能,并且仍然能够链接到 boost 库(这些库是从这个 mac 上的源代码构建的)

ps:在我的 Arch linux 机器上一切正常

我的生成文件:

LIBS = -lboost_program_options CXXFLAGS = -stdlib=libc++ -std=c++11 -Wall -g OBJ = fastq.o fastq_reader.o main.o degenerate.o interleave.o Complement.o interval_utils.o interval.o interval_utils_test_tool.o

雾角:$(OBJ) $(LINK.cc) -o $@ $^ $(LIBS)

使用 -stdlib=libc++ 的输出

$ make c++ -stdlib=libc++ -std=c++11 -Wall -g -c -o fastq.o fastq.cpp c++​​ -stdlib=libc++ -std=c++11 -Wall -g -c -o fastq_reader.o fastq_reader.cpp c++​​ -stdlib=libc++ -std=c++11 -Wall -g -c -o main.o main.cpp c++​​ -stdlib=libc++ -std=c++11 -Wall -g -c -o degenerate.o degenerate.cpp c++​​ -stdlib=libc++ -std=c++11 -Wall -g
-c -o interleave.o interleave.cpp c++​​ -stdlib=libc++ -std=c++11 -Wall -g -c -olement.ocomplement.cpp c++​​ -stdlib=libc++ -std=c++11 -Wall -g -c -o interval_utils.o interval_utils.cpp c++​​ -stdlib=libc++ -std=c++11 -Wall -g -c -o interval.o interval.cpp c++​​ -stdlib=libc++ -std=c++11 -Wall -g -c -o interval_utils_test_tool.o interval_utils_test_tool.cpp c++​​ -stdlib=libc++ -std=c++11 -Wall -g
-o 雾角 fastq.o fastq_reader.o main.o degenerate.o interleave.o added.o interval_utils.o interval.o interval_utils_test_tool.o -lboost_program_options 架构 x86_64 的未定义符号:“boost::program_options::to_internal(std::__1::basic_string, std::__1::allocator > const&)”, 参考自: std::__1::vector, std::__1::allocator >, std::__1::allocator, std::__1::allocator > > > boost::program_options::to_internal, std::__1::allocator >

(std::__1::vector, std::__1::allocator >, std::__1::allocator, std::__1::allocator > > > const&) 在 main.o

  ... [clipped output for readability]

ld:未找到架构 x86_64 的符号 clang:错误:链接器 命令失败,退出代码 1(使用 -v 查看调用) make: * [雾喇叭] 错误 1

【问题讨论】:

  • 我在/usr/include/c++/4.2.1/tr1/unordered_map 有标题,你的xcode 是最新的吗? (你的命令行工具是最新的吗)
  • 使用“--with-c++11”标志安装带有自制程序的boost并很高兴。
  • 这实际上是一个很棒的提示。我最终手动安装了它。

标签: c++ macos boost c++11


【解决方案1】:

edit:请参阅下面的现代 MacOS 的 cmets; --c++11 标志不再有效

经过大量研究,我了解到以下内容:

  • MacOS X 上的所有内容都是使用 stdlibc++ 构建的(包括您使用 homebrew 安装的所有内容——我就是这样)
  • gcc 4.2 附带的stdlibc++ 没有实现c++11 的许多功能。例如 unordered_map, to_string, stoi, ... 只有 libc++ 可以。
  • libc++ 由 XCode 安装在 MacOS 中。

结论:

  • 如果您使用的是 c++11,您必须使用 -stdlib=libc++。
  • 如果您想使用 boost 或任何其他库,您还必须使用 -stdlib=libc++ 重新编译它们。

所以我从他们的网站下载了 boost 源码,并使用以下命令行进行编译:

bootstrap.sh && b2 toolset=clang cxxflags="-stdlib=libc++" linkflags="-stdlib=libc++" install

如果您使用 Homebrew,您可以使用它,它会为您做正确的事情:

brew install boost --c++11 

【讨论】:

  • 我有 macOS Sierra,在你的最后一个命令之后我得到:Warning: boost: this formula has no --c++11 option so it will be ignored!
  • 这仍然是最新的吗?
  • 没有。不久前,macOS 中的 clang 开始默认为 libc++ 而不是 libstdc++。您不必再明确指定您想要新的 C++ 标准。不过,您仍然需要安装 Xcode 和 clang 才能访问 C++11 标头等。
猜你喜欢
  • 2016-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-25
  • 2016-02-28
  • 2021-06-05
  • 1970-01-01
  • 2012-03-16
相关资源
最近更新 更多