【问题标题】:XCode with boost "Semantic Issue - undeclared identifier va_start"带有提升“语义问题 - 未声明的标识符 va_start”的 XCode
【发布时间】:2012-09-16 09:34:50
【问题描述】:
C++locale.h
->Semantic Issue
-->Use of undeclared identifier 'va_start'
->Semantic Issue
-->Use of undeclared identifier 'va_end'

第一次使用boost,使用ports下载并在XCode中创建了一个命令行项目。 标头搜索路径:/usr/include/**

代码中还没有什么,只是默认项目自带的main函数。

只是不知道该怎么办,没想到会发生这种情况。

编辑1:

第一次出现:

#ifndef _GLIBCXX_CSTDARG
#define _GLIBCXX_CSTDARG 1

#pragma GCC system_header

#include <bits/c++config.h>
#include <stdarg.h>

// Adhere to section 17.4.1.2 clause 5 of ISO 14882:1998
#ifndef va_end
#define va_end(ap) va_end (ap)
#endif

_GLIBCXX_BEGIN_NAMESPACE(std)

  using ::va_list;

_GLIBCXX_END_NAMESPACE

#endif

这是一个在 \usr\include\c++\4.2.1 中没有扩展名的文件,我刚刚意识到这个文件与 boost 无关,这里发生了一些令人讨厌的事情。

EDIT2:将包含目录修复到 /opt/local/include/** 后出现新错误:

/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/c++/v1/type_traits:214:46:
Use of undeclared identifier 'nullptr_t'; did you mean 'nullptr'?

还有其他错误,都和sr/lib/c++/v1/文件夹下的这些文件有关,这是为什么?这些文件似乎是一些核心功能,它们不能被破坏。

这是错误的图片,也许你们看到了什么

EDIT3:将编译器从 Apple LLVM 更改为 GCC LLVM 将错误减少到只有一个: “vspintf 不是‘std’的成员”在 c++locale.h 中。好吧,现在我完全迷路了。

【问题讨论】:

  • 实际编译/构建时是否出现错误?还是只是来自 Xcode IDE 的警告?
  • 首先,您是在 Xcode GUI 中、通过 xcodebuild 还是使用命令行工具链进行构建?你有多个 Xcode 版本吗?安装 MacPorts 后,您是否更改过 Xcode 版本? (我问了最后一个,因为我确实遇到了这个问题——boost 是针对 10.6 SDK 构建的,当我更新 Xcode 时,我不再拥有 10.6 SDK,并且在命令行构建中会导致奇怪的错误,看起来就像你的错误。 )
  • 另外,如果您使用的是 clang 而不是 gcc,请确保您没有混合使用 libc++ 和 libstdc++。
  • 这是一个错误,它不会完成构建。使用 Xcode IDE 编译。我刚刚安装了 macpors 来安装 boost,它与它们的 xcode 相同。我不知道我在用什么,我认为它是默认编译器(LLVM)
  • 刚刚创建了另一个全新的 XCode 命令行工具应用程序。构建 Hello World 时完全没有错误,但只是添加 Header Search Path 会破坏编译并出现上述错误,我的代码中还没有提到 boost,只是添加了搜索路径。

标签: c++ xcode macos boost


【解决方案1】:

我遇到了同样的问题,我已经用自制软件安装了 Boost,当我在 XCode 中添加“标题搜索路径”(/usr/local/Cellar/boost/1.54.0/include 和递归选项)时,构建抛出这些错误。

为了解决这个问题,我将“标题搜索路径”上的递归选项更改为非递归,并且它起作用了。

【讨论】:

  • 将递归更改为非递归解决了我在 Mavericks 上的问题
  • 是的,递归到非递归是我的问题。
【解决方案2】:

首先,您可能没有#includeing 正确的标题。

比如不#include &lt;cstddef&gt;,就不能用std::nullptr_t;尝试这样做会给你:

Semantic issue: Use of undeclared identifier 'nullptr_t'. Did you mean 'nullptr'?

通常,拉入一个标头会隐式拉入各种其他标头,因此即使不应该这样做也能正常工作。 libstdc++ 比 libc++ 做的更多,前者是 llvm-g++(“GCC LLVM”)的默认库,后者是 clang(“Apple LLVM”)的默认库,这意味着很多错误似乎会消失你切换到“GCC LLVM”(或者只是坚持使用“Apple LLVM”并切换你的库),但你的代码仍然是错误的。

另一种可能是您尝试在 C++03 模式下编译 C++11。例如,当你在 C++03 模式下 #include &lt;cstddef&gt; 时,它不应该定义 nullptr_t。无论如何,它可能会这样做——它可能会使用 llvm-g++ 和/或 libstdc++,但不会使用 clang 和/或 libc++。但是你的代码(或者,在这种情况下,你的项目)仍然是错误的,应该修复。

如果您可以向我们展示生成这些错误的实际(精简)代码,并准确告诉我们您在 Xcode 中创建的默认“命令行工具,C++”项目更改了哪些设置(假设这是您创建的),应该可以更具体一些。

要获得一个使用 boost 的最小程序,假设您已经正确安装了 Xcode、MacPorts 和 MacPorts boost,您所要做的就是:

  • 创建一个新的命令行工具,C++。
  • 点击项目,然后在 Search Paths 下,转到 Header Search Paths,并对其进行编辑以添加 /opt/local/include
  • 修改main.cpp 如下所示:

main.cpp

#include <iostream>
#include <boost/uuid/uuid.hpp>

int main(int argc, const char * argv[])
{
    boost::uuids::uuid u1 = {
        0x12, 0x34, 0x56, 0x78,
        0x90, 0xab, 0xcd, 0xef,
        0x12, 0x34, 0x56, 0x78,
        0x90, 0xab, 0xcd, 0xef };
    boost::uuids::uuid u2 = {
        0x12, 0x34, 0x56, 0x78,
        0x90, 0xab, 0xcd, 0xef,
        0x12, 0x34, 0x56, 0x78,
        0x90, 0xab, 0xcd, 0xef };
    std::cout << (u1 == u2) << "\n";
    return 0;
}

我选择 boost::uuid 是因为它是一个非常简单的库,但同样适用于编译 boost 的任何部分。

boost 的某些部分还要求您在库中进行链接。为此,您还需要将/opt/local/lib 添加到库搜索路径,然后才能使用大多数常用技术将库添加到项目中。

请注意,如果您是最新版本,则可以将其缩短,因为在 Xcode 4.5 中,默认值为 Apple LLVM Compiler 4.1、GNU++11 dialect 和带有 C++11 支持库的 libc++。但我确保我的代码与 C++03 兼容,因此它几乎可以在任何 Xcode 版本中使用默认值(我使用 3.2 进行了测试),因为您从未告诉我们您使用的是什么版本。

【讨论】:

  • 我用自制软件重新下载了 boost,似乎自制软件把 boost 放在 /usr/local/include 中,有什么问题吗? Xcode 和 ML 正在更新中,更新后我将创建一个全新的项目,在 header 搜索路径中添加 boost 并上传,以便您查看。
  • 应该没问题,尤其是我自己用的就是这个;只需使用/usr/local 代替/opt/local 上面出现的任何位置。 (除非你同时安装了 Homebrew 和 MacPorts,这通常是个坏主意。如果你有问题,你可能想暂时隐藏 MacPorts,例如,sudo mv /opt/local /opt/local-bak。)
  • 这不适用于 xcode 5.1 =( 仍然是同样的错误,有什么想法吗?
【解决方案3】:

我遇到了这个问题并解决了。在 osx mavericks 上的 XCode 中,必须将 /opt/local/libs/ 添加到库搜索路径(非递归)。然后我将 /opt/local/include/ 添加到标题搜索路径(也是非递归的)。

【讨论】:

  • 谢谢,这对我有帮助。
【解决方案4】:

您需要#include &lt;stdarg.h&gt; 才能使用va_start 宏等。如果这些错误发生在头文件中,则该头文件应包含&lt;stdarg.h&gt;;如果没有,您可以通过自己包含它来解决它包含有问题的标头之前(但如果可能,您还应该将问题报告给库开发人员)。

【讨论】:

  • 我已经用文件编辑了问题,如果第一次发生,它看起来已经包含了 stdarg.h
【解决方案5】:

从最新的评论来看,我想我知道问题所在了。

标头搜索路径:/usr/include/**

刚刚创建了另一个全新的 XCode 命令行工具应用。构建 Hello World 时完全没有错误,但只是添加 Header Search Path 会破坏编译并出现上述错误,我的代码中还没有提到 boost,只是添加了搜索路径。

你从哪里得到/usr/include/**的搜索路径?

MacPorts 将所有内容安装到/opt/local,而不是/usr,所以你想要/opt/local/include(或/opt/local/include/**/opt/local/include/boost);添加 /usr/include/** 对 Boost 毫无帮助。

但是,它可能在您使用 Boost 之前破坏您的代码。

/usr/include 中的内容是 Xcode 的命令行工具。如果你没有这些,你就会得到一组不完整且无法使用的标题;如果这样做,您将获得一组与基于 SDK 的构建冲突的标头。

答案是不要将/usr/include/** 添加到您的搜索路径中。

或者,如果您确实需要添加它(但实际上您不需要),请将 Base SDK 更改为“Current OS X”而不是“Latest OS X”,这意味着您将获得默认标头出/usr/include 而不是/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk/usr/include,当然添加已经存在的路径不会导致任何冲突。

【讨论】:

  • 情况发生了变化,我被误导了,将下载并安装的 macports 放在 /usr 中的页面我现在找不到。但是现在我有了新的错误,它们都是“语义的”,我会用正确的错误和文件更新问题。
  • 如果你能分享一个使用 boost 的 XCode 项目,我会很高兴。
  • 好吧,我的 boost 是由 Homebrew 而不是 MacPorts 安装的,所以你必须将标题搜索路径从 /usr/local/include 编辑到 /opt/local/include。而且,由于这是我对默认值的唯一更改,因此您可以轻松地从默认值开始。
  • 查看我的其他答案以获取分步说明。
  • 我刚刚遇到了同样的问题,并且在我的 Xcode 项目中使用 Boost 时遇到了所有这些错误。经过反复试验,我发现标头和库路径应该是非递归的。一旦我这样做了,它就全部编译没有错误。
【解决方案6】:

我似乎已经修复了它。在尝试使用 homebrew、macports 和手动安装之后,很难在 Xcode 的后端找到需要更改的所有内容,我承认有时仍然会感到有些困惑。 所以标题搜索路径仍然包含自制地窖作为长路径名的一部分,所以我更改了这个位 /usr/include 根据我在寻找解决方案时发现的一些说明,我拥有的用户标头路径为 /usr/local/lib。我现在已将其更改为 /usr/local/lib

经过这些更改,我的错误终于消失了!手指交叉,我现在明白了

【讨论】:

    猜你喜欢
    • 2012-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-21
    • 2013-10-18
    • 1970-01-01
    • 1970-01-01
    • 2014-11-14
    相关资源
    最近更新 更多