web-dev-qa-db-ja.com

いくつかの単純なC ++コードのコンパイル時のエラー

Osx lionでこのcppコードをコンパイルしようとしましたが、エラーが発生します。

#include <iostream> 

using namespace std; 

int main (int argc, char *argv[]) 
{ 
    for(int i = 0; i < 10; i++) 
    { 
        cout << "hi"; 
        cout << endl; 
    } 

    return 0; 
}

コンパイルします:

cc main.cpp

エラー:

Undefined symbols for architecture x86_64:
  "std::cout", referenced from:
      _main in ccBdbc76.o
  "std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)", referenced from:
      _main in ccBdbc76.o
  "std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)", referenced from:
      _main in ccBdbc76.o
  "std::basic_ostream<char, std::char_traits<char> >::operator<<(std::basic_ostream<char, std::char_traits<char> >& (*)(std::basic_ostream<char, std::char_traits<char> >&))", referenced from:
      _main in ccBdbc76.o
  "std::ios_base::Init::Init()", referenced from:
      __static_initialization_and_destruction_0(int, int)in ccBdbc76.o
  "std::ios_base::Init::~Init()", referenced from:
      ___tcf_0 in ccBdbc76.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status
42

通常、この種の障害は、Cフロントエンドを呼び出してC++コードをコンパイルするときに発生します。実行するgccは、ファイルをC++として認識およびコンパイルしますが、C++ライブラリとリンクしません。例:

$ gcc example.cpp 
Undefined symbols for architecture x86_64:
  "std::cout", referenced from:
      _main in ccLTUBHJ.o
  "std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)", referenced from:
      _main in ccLTUBHJ.o
  "std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)", referenced from:
      _main in ccLTUBHJ.o
  "std::basic_ostream<char, std::char_traits<char> >::operator<<(std::basic_ostream<char, std::char_traits<char> >& (*)(std::basic_ostream<char, std::char_traits<char> >&))", referenced from:
      _main in ccLTUBHJ.o
  "std::ios_base::Init::Init()", referenced from:
      __static_initialization_and_destruction_0(int, int)in ccLTUBHJ.o
  "std::ios_base::Init::~Init()", referenced from:
      ___tcf_0 in ccLTUBHJ.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status
$ g++ example.cpp 
$ 

ご覧のとおり、g++を使用すると、問題はなくなります。 clang(推奨)を使用すると、同じ動作(わずかに異なるメッセージ)が発生します。

$ clang example.cpp 
Undefined symbols for architecture x86_64:
  "std::ios_base::Init::~Init()", referenced from:
      ___cxx_global_var_init in cc-IeV9O1.o
  "std::ios_base::Init::Init()", referenced from:
      ___cxx_global_var_init in cc-IeV9O1.o
  "std::cout", referenced from:
      _main in cc-IeV9O1.o
  "std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)", referenced from:
      _main in cc-IeV9O1.o
  "std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)", referenced from:
      _main in cc-IeV9O1.o
  "std::ostream::operator<<(std::ostream& (*)(std::ostream&))", referenced from:
      _main in cc-IeV9O1.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
$ clang++ example.cpp 
$

clangエラーメッセージでわかるように、-vを使用してリンカーの呼び出しを確認し、何が問題なのかを確認できます。次のリンク行が表示されます。

"/usr/bin/ld" -demangle -dynamic -Arch x86_64 
    -macosx_version_min 10.6.8 -o a.out -lcrt1.10.6.o
    /var/folders/zl/zlZcj24WHvenScwjPFFFQE+++TI/-Tmp-/cc-hdOL8Z.o
    -lSystem /Developer/usr/bin/../lib/clang/3.0/lib/darwin/libclang_rt.osx.a

またはそのようなもの-ご覧のように、C++ではなくCランタイムをリンクしており、C++ライブラリもありません。 clang++を使用すると、リンク行は次のようになります。

"/usr/bin/ld" -demangle -dynamic -Arch x86_64
     -macosx_version_min 10.6.8 -o a.out -lcrt1.10.6.o 
     /var/folders/zl/zlZcj24WHvenScwjPFFFQE+++TI/-Tmp-/cc-wJwxjP.o 
     /usr/lib/libstdc++.6.dylib -lSystem
     /Developer/usr/bin/../lib/clang/3.0/lib/darwin/libclang_rt.osx.a

ご覧のとおり、libstdc++が含まれており、リンクエラーはありません。

89
Carl Norum

試してみる

g++ main.cpp

少なくともOS Xを使用して、このように動作するはずです

5
Allisone

OSX LIONに詳しくない。ただし、厳密な意味では、説明されているエラーはコンパイラではなく、リンカが原因です。標準ライブラリがリンクされていないようです。

3
S.C. Madsen

CCコマンド(大文字)を使用してC++をコンパイルし、標準C++ライブラリにリンクします。

3
AndrzejJ

OS Xでclangを使用している場合は、次を試してください。

clang++ simple_cpp_program_file.cpp -o simple_cpp_program_file.out
1
jkhosla

MacOs Sierraで動作するソリューションは次のとおりです。

OS Xで利用可能な標準C++ライブラリには、libstdc ++とlibc ++の2つの実装があります。これらはバイナリ互換ではなく、libMLi3にはlibstdc ++が必要です。

10.8以前ではlibstdc ++がデフォルトで選択され、10.9ではlibc ++がデフォルトで選択されています。 libMLi3との互換性を確保するには、libstdc ++を手動で選択する必要があります。

これを行うには、リンクコマンドに-stdlib = libstdc ++を追加します。

1
user1031613

ヨセミテ(10.10.1)の時点で、gcc-lc++フラグも機能します。

gcc -lc++ main.cpp
1

このGCCはWindows(MinGW)またはLinuxですか? MinGWでは、パラメータ-lmingw32 -enable-auto-importが必要です。 Linuxには同様のものが必要かもしれませんが、-enable-auto-importが必要になる可能性が高いです。

0
Frigo

したがって、エラーld:-lstdc ++のライブラリが見つかりませんでしたが、実際のエラーの場所です。

これを修正するには、フォルダーを開きます

/ Library/Developer/CommandLineTools/Packages /を開きます

パッケージmacOS_SDK_headers_for_macOS_10.14.pkgを実行します

次に、gem install mini_racerが機能します!

この問題は、拡張機能をコンパイルするgemに影響を与える可能性があるため、mini_racerだけに関連しているわけではありません。

0
wangqingtao