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文件夹中的这些文件有关/为什么?这些文件似乎是一些核心功能,它们无法破解。
这是错误的图片,也许你们看到的东西
EDIT3:将编译器从Apple LLVM更改为GCC LLVM会将错误减少到只有一个: “vspintf不是c ++ locale.h中'std'的成员”。好的,现在我完全迷失了。
答案 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,你所需要做的就是:
/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)
经过这些改变,我的错误终于消失了!手指越过我现在就明白了