11
C++locale.h
->Semantic Issue
-->Use of undeclared identifier 'va_start'
->Semantic Issue
-->Use of undeclared identifier 'va_end'

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

代码中还没有任何内容,只有默认 proj 附带的 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 中。好吧,现在我完全迷路了。

4

6 回答 6

11

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

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

于 2013-12-17T13:45:52.467 回答
3

首先,您可能没有使用#include正确的标题。

例如,如果你不这样做#include <cstddef>,你就不能使用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。例如,当您#include <cstddef>处于 C++03 模式时,它不应该定义nullptr_t. 无论如何,它可能会这样做——它可能会使用 llvm-g++ 和/或 libstdc++,但不会使用 clang 和/或 libc++。但是你的代码(或者,在这种情况下,你的项目)仍然是错误的,应该修复。

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

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

  • 创建一个新的命令行工具 C++。
  • 单击项目,然后在搜索路径下,转到标题搜索路径,然后对其进行编辑以添加/opt/local/include.
  • 修改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 编译器 4.1、GNU++11 方言和带有 C++11 支持库的 libc++。但是我确保我的代码与 C++03 兼容,因此它几乎可以在任何 Xcode 版本中使用默认值(我使用 3.2 进行了测试),因为您从未告诉我们您使用的是什么版本。

于 2012-09-24T23:48:02.207 回答
3

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

于 2013-11-22T21:27:48.140 回答
2

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

于 2012-09-24T21:40:17.347 回答
1

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

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

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

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

MacPorts 将所有内容安装到/opt/local, not /usr, 所以你想要/opt/local/include(or /opt/local/include/**or /opt/local/include/boost); 添加/usr/include/**对Boost根本没有帮助。

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

里面有/usr/includeXcode 的命令行工具。如果你没有这些,你就会得到一组不完整且无法使用的标题;如果你这样做了,你就会得到一组与基于 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当然添加已经存在的路径不会导致任何冲突。

于 2012-09-24T22:50:09.193 回答
0

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

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

于 2015-03-11T23:42:08.493 回答