4

我需要使用 编译 boost 库ExternalProject_Add,并且构建命令需要使用 Clang 在 MacOS 平台上使用 c++11 标志。

该命令应如下所示:

./bin/b2 debug release cxxflags="-std=c++11 -stdlib=libc++" linkflags=-stdlib=libc++

但我对引号和空格有疑问。

set(BOOST_CXX_FLAGS cxxflags="-std=c++11 -stdlib=libc++")
set(BOOST_TOOL_SET toolset=clang ${BOOST_CXX_FLAGS}
linkflags=-stdlib=libc++)
ExternalProject_Add(boost
  ....
  BUILD_COMMAND ./bin/b2 debug release
    ${BOOST_TOOL_SET} 
  ....
)

${BOOST_TOOL_SET}值是一个列表,并且cxxflags="-std=c++11 -stdlib=libc++"是其中的一项。生成的命令行变得奇怪:

./bin/b2 debug release "cxxflags=\"-std=c++11 -stdlib=libc++\""
linkflags=-stdlib=libc++

当 CMake 检测到参数内的空格并用引号将其包裹时,似乎该标志是由 CMake 翻译的,但这不是我想要的。

我在互联网上搜索,但没有找到任何帮助。关于这个问题有什么提示吗?

4

2 回答 2

3

这应该有效:

set(BOOST_CXX_FLAGS "cxxflags=-std=c++11 -stdlib=libc++")

这应该产生

./bin/b2 debug release "cxxflags=-std=c++11 -stdlib=libc++"

在正常的 shell 解析规则下,这相当于对你有用:

./bin/b2 debug release cxxflags="-std=c++11 -stdlib=libc++"
于 2013-06-17T12:49:43.427 回答
1

这并不能准确回答您的问题,因为我看不到将您请求的命令行获取到 b2 exe 且该cxxflags="-std=c++11 -stdlib=libc++"部分格式正确的方法。

但是,我相信您可以通过调用cxxflags=两次来达到预期的效果。每个参数都附加到最终由 b2 调用的编译器标志。

所以你应该能够做到:

set(BOOST_CXX_FLAGS cxxflags=-std=c++11 cxxflags=-stdlib=libc++)

b2 调用的最终命令将类似于

"clang++" ... -std=c++11 -stdlib=libc++ ...

要验证这一点,您可以添加-d+2到您的命令:

BUILD_COMMAND ./bin/b2 debug release ${BOOST_TOOL_SET} -d+2

这会导致将完整的命令写入 boost-stamp 目录中的 boost-build-out.log 文件。

于 2013-06-17T23:45:37.727 回答