XCode with boost“Semantic Issue - undeclared identifier va_start”

时间:2012-09-24 21:35:53

标签: c++ xcode macos boost

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

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

代码中没有任何内容,只是默认项目附带的主要功能。

只是不知道该怎么做,从未预料到会发生这种情况。

EDIT1:

第一次出现:

#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:将include dir修复为/ 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文件夹中的这些文件有关/为什么?这些文件似乎是一些核心功能,它们无法破解。

这是错误的图片,也许你们看到的东西 Errors

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

6 个答案:

答案 0 :(得分:11)

我有同样的问题,我用自制软件安装了Boost,当我在XCode中添加'Header Search Path'(/usr/local/Cellar/boost/1.54.0/include with recursive option)时抛出那些错误。

要修复它,我在“标题搜索路径”上将递归选项更改为非递归,并且它有效。

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

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

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

  • 创建一个新的命令行工具,C ++。
  • 点击该项目,然后在“搜索路径”下,转到“页眉搜索路径”,然后对其进行编辑以添加/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编译器4.1,GNU ++ 11方言和带有C ++ 11支持库的libc ++。但我确保我的代码与C ++ 03兼容,所以它适用于几乎任何版本的Xcode中的默认值(我用3.2测试过),因为你从未告诉我们你使用的是什么版本。

答案 2 :(得分:3)

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

答案 3 :(得分:2)

您需要#include <stdarg.h>才能使用va_start宏等。如果这些错误发生在头文件中,那么该头文件应包含<stdarg.h>;如果没有,你可以自己包含它,然后包含有问题的标题(但如果可能的话,你也应该向库开发人员报告)。

答案 4 :(得分:1)

根据最新评论,我想我知道这个问题。

  

标题搜索路径:/ 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更改为&#34;当前OS X&#34;而不是&#34;最新的操作系统X&#34;,这意味着您将从/usr/include而不是/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk/usr/include获取默认标头,当然还要添加& #39;已经在那里不会导致任何冲突。

答案 5 :(得分:0)

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

经过这些改变,我的错误终于消失了!手指越过我现在就明白了