48

すべて、私は自分の mac os x 10.8 でこのようなコードを書き、「gcc use_new.cpp -o use_new」を使用してコンパイルすると、次のような間違ったメッセージがスローされます。

Undefined symbols for architecture x86_64:
  "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 ccr2vrRQ.o
  "std::basic_ostream<char, std::char_traits<char> >::operator<<(void const*)", referenced from:
      _main in ccr2vrRQ.o
  "std::basic_ostream<char, std::char_traits<char> >::operator<<(double)", referenced from:
      _main in ccr2vrRQ.o
  "std::basic_ostream<char, std::char_traits<char> >::operator<<(int)", referenced from:
      _main in ccr2vrRQ.o
  "std::basic_ostream<char, std::char_traits<char> >::operator<<(unsigned long)", referenced from:
      _main in ccr2vrRQ.o
  "std::ios_base::Init::Init()", referenced from:
      __static_initialization_and_destruction_0(int, int) in ccr2vrRQ.o
  "std::ios_base::Init::~Init()", referenced from:
      __static_initialization_and_destruction_0(int, int) in ccr2vrRQ.o
  "std::cout", referenced from:
      _main in ccr2vrRQ.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 ccr2vrRQ.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 ccr2vrRQ.o
  "operator delete(void*)", referenced from:
      _main in ccr2vrRQ.o
  "operator new(unsigned long)", referenced from:
      _main in ccr2vrRQ.o
ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status

そして、「g++ use_new.cpp -o use_new」を使用すると、誰が助けてくれますか!? ありがとう!

#include <iostream>      
    struct fish              
    {
        float weight;
        int id;
        int kind;              
    };
    int main()               
    {
      using namespace std;   
      int* pt = new int;     
      *pt = 1001;            
      cout<<"int: "<<*pt<<"in location: "<<pt<<endl;
      double* pd = new double;
      *pd = 100000001.0;     
      cout<<"double: "<<*pd<<"in location: "<<pd<<endl;
      cout<<"int point pt is length "<<sizeof(*pt)<<endl;
      cout<<"double point pd is length "<<sizeof(*pd)<<endl;
      delete pt;             
      delete pd;             
      cout<<(int *)"How are you!"<<endl;
      return 0;
  }
4

3 に答える 3

105

これは、古い 4.2 GCC でも当てはまります (非公式の iOS ツールチェーンをセットアップしたときにこれを経験しました)。gccデフォルトで C を想定し、C++ 標準ライブラリにリンクせずにリンカーを呼び出します。対照的に、g++C++ を想定し、デフォルトで C++ 標準ライブラリにリンクします。

全体として-可能な解決策:

gcc myprog.c -o myprog -lstdc++

また

g++ myprog.c -o myprog
于 2012-08-15T19:28:13.850 に答える
16

このstackoverflowの質問に対する答えには答えがあります

gcc および g++ リンカー

使用する

gcc -lstdc++ use_new.cpp -o use_new

この-lstdc++フラグは、リンカーに C++ 標準ライブラリを含めるように指示します。

http://en.wikipedia.org/wiki/C%2B%2B_Standard_Library

Mac OS X 10.7.4 を実行しており、ライブラリはここにあります

/usr/lib/libstdc++.dylib
于 2012-08-15T19:13:16.560 に答える
5

これは、@ user1582840 によって貼り付けられたコードとは関係がなく、私の 2 セントだけであり、自分のコードのいくつかで作業しているときに g++ で同じ問題が発生する別の原因によるものです。

別の理由で OS X 10.8/Darwin11 で g++ 4.2.1 を使用すると、「ld: アーキテクチャ x86_64 のシンボルが見つかりません」というエラーが発生しました。うまくいけば、これは問題をグーグルで検索するのに役立ちます。

クラスを定義し、クラス定義でメンバー関数を宣言したため、このエラーを受け取りました。ただし、メンバー関数を定義するときに、クラス修飾子を含めるのを忘れていました。

したがって、私が話していることの例(コードサンプル、完全なプログラムではありません):

class NewClass
{
    NewClass(); // default constructor
};

その後、 NewClass() コンストラクター (または任意のメンバー関数) を定義するときに、次のようにしました。

// don't do this, it will throw that error!!
NewClass()
{
    // do whatever
}

それよりも:

// proper way
NewClass::NewClass()
{
    // do whatever
}

これはかなり単純な間違いであり、幸運にも短時間でそれを見つけることができましたが、誰か (特に私たち初心者) が見逃しやすい可能性があり、gcc/g++ リンカー、XCode などに関する解決策はありません。これについては何の助けにもなりません:P

繰り返しますが、お役に立てば幸いです。

于 2014-03-04T10:20:28.600 に答える