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

初めてブーストを使用し、ポートを使用してダウンロードし、XCode でコマンド ライン プロジェクトを作成しました。ヘッダー検索パス: /usr/include/**

コードにはまだ何もありません。デフォルトの proj に付属する main 関数だけです。

どうすればいいのかわからないだけで、これが起こるとは予想もしていませんでした。

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 にある拡張子のないファイルですが、このファイルはブーストとは何の関係もないことに気付きました。ここで厄介なことが起こっています。

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 に変更すると、エラーが 1 つだけに減少します。わかりました、今、私は完全に迷っています。

4

6 に答える 6

11

私は同じ問題を抱えていました.Boostを自作でインストールしました.XCodeに「ヘッダー検索パス」(/usr/local/Cellar/boost/1.54.0/include with recursiveオプション)を追加すると、ビルドはこれらのエラーをスローします.

それを修正するために、「ヘッダー検索パス」で再帰オプションを非再帰に変更しましたが、機能しました。

于 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'?

多くの場合、1 つのヘッダーをプルすると、他のさまざまなヘッダーが暗黙的にプルされるため、そうでない場合でも機能します。libstdc++ は libc++ よりも多くのことを行います。前者は llvm-g++ ("GCC LLVM") のデフォルト ライブラリであり、後者は clang ("Apple LLVM") のデフォルト ライブラリです。 「GCC LLVM」に切り替えます(または「Apple LLVM」に固執してライブラリを切り替えます)が、コードはまだ間違っています。

別の可能性として、C++11 を C++03 モードでコンパイルしようとしている可能性があります。たとえば#include <cstddef>、C++03 モードの場合は、 を定義しないでくださいnullptr_t。とにかくそうするかもしれません—そしてllvm-g ++やlibstdc ++ではそうかもしれませんが、clangやlibc ++ではそうではありません。しかし、コード (または、この場合はプロジェクト) はまだ間違っているため、修正する必要があります。

これらのエラーを生成する実際の (簡略化された) コードを見せて、Xcode で作成したデフォルトの「コマンド ライン ツール、C++」プロジェクトから変更した設定を正確に教えていただければ (作成したものと仮定して)、より具体的にできるはずです。

Xcode、MacPorts、および MacPorts boost が適切にインストールされていると仮定して、boost で動作する最小限のプログラムを取得するには、次の手順を実行する必要があります。

  • 新しいコマンド ライン ツール、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 のどの部分をコンパイルする場合でも同じことが機能するはずです。

ブーストの一部では、ライブラリにリンクする必要もあります。そのためには、/opt/local/libライブラリをプロジェクトに追加するための通常の手法のほとんどを使用する前に、ライブラリ検索パスに追加する必要もあります。

Xcode 4.5 では、デフォルトは Apple LLVM Compiler 4.1、GNU++11 ダイアレクト、C++11 サポート ライブラリを使用した libc++ になるため、最新の場合は、これをさらに短くすることができます。ただし、コードが C++03 と互換性があることを確認したので、Xcode のほぼすべてのバージョン (私は 3.2 でテストしました) のデフォルトで動作します。

于 2012-09-24T23:48:02.207 に答える
2

マクロなど#include <stdarg.h>を使用するために必要です。va_startこれらのエラーがヘッダー ファイルで発生している場合、そのヘッダー ファイルには<stdarg.h>;が含まれている必要があります。そうでない場合は、問題のあるヘッダーをインクルードするに自分でインクルードすることで回避できます (ただし、可能であれば、ライブラリ開発者にも問題を報告する必要があります)。

于 2012-09-24T21:40:17.347 に答える
1

最新のコメントから、私は問題を知っていると思います。

ヘッダー検索パス: /usr/include/**

別の新しい XCode コマンド ライン ツール アプリを作成しました。Hello World をビルドするときにエラーはまったくありませんが、ヘッダー検索パスを追加するだけで上記のエラーでコンパイルが中断されます。私のコードにはまだブーストへの参照がなく、検索パスを追加しただけです。

検索パスはどこで取得しました/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 を "Latest OS X" ではなく "Current 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 に答える