【问题标题】:Clang Apple C++11 correct setup for CMakeCMake的Clang Apple C ++ 11正确设置
【发布时间】:2016-05-14 01:43:01
【问题描述】:

我正在尝试将 CMake 配置为针对 OS X Target 进行编译。这是带有 OS X Yosemite v 10.10.2 的 IMac

Clang 版本:

Apple LLVM 版本 6.1.0 (clang-602.0.53)(基于 LLVM 3.6.0svn)

目标:x86_64-apple-darwin14.1.0

当我在没有放置任何编译器标志的情况下进行编译时,我在源代码中收到了这段代码的一个错误:

 static const char* LogLevelStr[] {
     "TRACE  " ,
     "INFO   " ,
     "WARNING" ,
     "ERROR  " ,
     "FATAL  " ,
};

错误:定义数组类型的变量需要一个 显式大小或初始化器

我在 Windows 和 GCC 上编译这段代码,它完全没问题,所以我不明白为什么 Clang 在这里抱怨。所以我决定,也许我必须设置 C++11 支持标志,因为我在代码很多。

设置

set (CMAKE_CXX_STANDARD 11)

set(CMAKE_CXX_FLAGS " -std=c++11")

添加更多奇怪的错误,例如:

/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__bit_reference:51:52: 错误: 预期的 ';'在声明列表的末尾 _LIBCPP_INLINE_VISIBILITY operator bool() const _NOEXCEPT ^ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__bit_reference:87:57: 错误: 预期的 ';'在声明交换结束时(__bit_reference<_cp> __x, __bit_reference<_cp> __y)_NOEXCEPT ^ >/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolc>hain/usr/bin/../include/c++/v1/__bit_reference:87:58: 错误: C++ 需要所有声明的类型说明符 >swap(__bit_reference<_cp> __x, __bit_reference<_cp> __y) _NOEXCEPT ^ >/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__config:338:21: 笔记: 从宏“_NOEXCEPT”扩展 /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__bit_reference:89:10: 错误: 预期 '(' 用于函数式强制转换或类型构造 布尔 __t = __x; ~~~~ ^ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__bit_reference:92:2: 错误: 预期的 ';'在顶级声明符之后} ^ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__bit_reference:1111:47: 错误: 预期的 ';'在声明列表的末尾 _LIBCPP_INLINE_VISIBILITY __bit_iterator() _NOEXCEPT

编译器上方的错误块在它试图解析包含时吐出

现在,我也尝试设置:

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

同样的错误。

我在这里想念什么?

更新:

我不明白为什么有些人将此问题标记为关闭。无论如何,这是更详细的问题。我尝试了所有这些 C++11 标志。我还在那个静态数组中添加了“=”。但大多数之后出现的错误。看起来那些的根是。在第一个被解析的地方,它进入另一个名为 __bit_reference 的类,编译器在第 51 行抱怨 在下一行 _LIBCPP_INLINE_VISIBILITY operator bool() const _NOEXCEPT

/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/__bit_reference:51:52: 预期的 ';'在声明列表的末尾

大多数其他错误也在某些方面与 stl 容器有关。

所以我的问题仍然有效。如何让我的源代码在 OS X 上使用最新的 Clang 进行编译,包括 C++11 支持。我正在尝试使用 Xcode 执行此操作并且遇到相同的问题。

Xcode 编译器输出(部分):

编译C /Users/michaeliv/Library/Developer/Xcode/DerivedData/xxxxxTest-hdkkzwyyppywsjgmoyuphranqtok/Build/Intermediates/xxxxxxTest.build/Debug/xxxxxxTest.build/Objects-normal/x86_64/XXXMath.o /Users/XXXXXXX/Documents/XXXXX/xxxxxx/src/XXXMath.cpp 正常 x86_64 c++ com.apple.compilers.llvm.clang.1_0.compiler cd /Users/xxxxxx/Desktop/xxxxTest 导出 LANG=en_US.US-ASCII /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -x c++ -arch x86_64 -fmessage-length=0 -fdiagnostics-show-note-include-stack -fmacro-backtrace-limit=0 -std=gnu++11 -stdlib=libc++ ....

【问题讨论】:

  • 能否请您发布完整的错误消息日志?
  • 我不能放一个完整的日志,因为我还有一些我不能透露的名字和路径。我会在上面添加更多的错误信息,但大多数都是一样的跨度>
  • 请提供完整的编译器命令行。
  • 在这种情况下,重命名日志中存在机密性问题的任何标识符。没有日志和命令行 ---> 没有答案的机会
  • 我的终端没有显示编译器的完整命令行

标签: c++ macos c++11 cmake clang


【解决方案1】:

很难确定,因为您没有发布可重现的问题。

但是,您发布的代码示例包含一个缺陷:

static const char* LogLevelStr[] {
     "TRACE  " ,
     "INFO   " ,
     "WARNING" ,
     "ERROR  " ,
     "FATAL  " ,
};

应该改为

static const char* LogLevelStr[] = {
     "TRACE  " ,
     "INFO   " ,
     "WARNING" ,
     "ERROR  " ,
     "FATAL  " ,
};

关于 C++11 标准,我不是 100% 的,但是,这是我的理解。

当您编写static const char* foo[] = { "foo", "bar", "baz", }; 时,这是聚合初始化,而不是列表初始化或任何其他类型。在您的代码示例中,您似乎正在尝试使用 C++11 列表初始化来初始化数组。但是,据我所知,这是不可能的,标准第 8 章中描述的“大括号或等号”语法并不适用。

此答案引用“第 8 条”,认为标准不允许 C 样式数组的列表初始化:Initializing a member array in constructor initializer

IMO 就是问题所在,如果我是你,我会在那里使用 =,即使在 C++11 或某些未来标准中允许省略它。

【讨论】:

    猜你喜欢
    • 2014-03-02
    • 2017-03-20
    • 2021-12-16
    • 2016-09-06
    • 1970-01-01
    • 1970-01-01
    • 2015-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多