0

Mac で Windows ベースのプロジェクトを構築しています。多くのエラーを修正しましたが、コンパイルすると次のエラーが発生します。

    Undefined symbols for architecture x86_64:
  "Timer::reset()", referenced from:
      Timer::Timer() in main.o
  "Log::Log()", referenced from:
      __static_initialization_and_destruction_0(int, int)in main.o
  "Log::~Log()", referenced from:
      ___tcf_1 in main.o
  "Render::initSDL(int, int, int)", referenced from:
      init()    in main.o
  "Log::writeError(char*, ...)", referenced from:
      init()    in main.o
      _SDL_main in main.o
  "EntityManager::init(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, int)", referenced from:
      init()    in main.o
  "EntityManager::loadAssets()", referenced from:
      init()    in main.o
  "Level::getBlockCount()", referenced from:
      EntityManager::getBlockCount()       in main.o
  "Level::getBombCount()", referenced from:
      EntityManager::getBombCount()       in main.o
  "Level::getItemCount()", referenced from:
      EntityManager::getItemCount()       in main.o
  "Render::renderElement(int, int, SDL_Surface*, SDL_Rect*)", referenced from:
      renderScene()     in main.o
  "EntityManager::getElement(int, ElementType)", referenced from:
      renderScene()     in main.o
  "Render::finishRender()", referenced from:
      renderScene()     in main.o
  "EntityManager::update()", referenced from:
      _SDL_main in main.o
  "EntityManager::interpolate(double)", referenced from:
      _SDL_main in main.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status

なぜいくつかの関数しか参照していないのか不思議です。これらの機能には、Mac と互換性のないコンテンツが含まれていますか?

例えば:

int Level::getItemCount()
{
    return itemVec.size();
}

明確にするために、 itemVec はベクトルです。

ありがとう

4

2 に答える 2

0

リンカ エラーが発生した場合、コンパイラは宣言を見つけることができたが、リンカは定義を見つけることができなかったことを意味します。

あなたはすでに知っていると思いますが、念のために:

メソッドの場合、宣言はその署名のみです。

class foo 
{
    public:
        void bar(); 
}

それはメソッド「void Foo::bar()」の宣言であり、ヘッダー ファイル (.h、.hpp、...) に入ります。

現在、このメソッドの定義には本体も含まれています。宣言と一致する必要があります。同じ例:

void Foo::bar()
{
std::cout << "Hello, world !" << std::endl;
}

これはメソッド「void Foo::bar()」の定義であり、(一般に) ソース ファイル (.cpp、.cxx、...) に入ります。

あなたの場合、コンパイラは宣言を見つけますが、リンカは定義を見つけません。したがって、Timer::reset() が定義されている場所を見つけて、この場所がリンカで利用可能であることを確認する必要があります。

その最も一般的な理由は、Timer::reset() が cpp ファイルで定義されており、そのファイルが xcode プロジェクトに含まれていないことです (心配しないでください。 Premake、Cmake などの優れたビルド構成ツール ...)

その場合、コードのどこかに #include "timer.h" などがあるためシンボルが宣言されますが、一致する cpp がプロジェクトに含まれていないため定義されません。(おそらく) ハード ドライブに存在しますが、プロジェクトでは参照されていません。

これを解決するには:

  1. Timer::reset が定義されている場所を調べます
  2. どこにも定義されていない場合は、問題が見つかりました。呼び出される場合は定義する必要があります
  3. 定義されている場合は、cpp がプロジェクトの main.cpp と同じモジュールに含まれていることを確認します。

特定の機能でのみ発生するとおっしゃっています。関数が呼び出されない場合、エラーは発生しないと付け加えるかもしれません。main.cpp で実際に呼び出される関数でのみこのエラー メッセージが表示されますか?

詳細については :

私の知る限り(私が通常遭遇する状況ではないため、間違っている可能性があります)、コンパイラは一度に1つのファイルを処理し、何かを宣言しても定義しないことは完全に合法です(結局のところ、別のファイルで定義できます) )コンパイル段階で

リンカーはすべてのファイルを一緒に配置するので、シンボルが使用されている場合 (あなたの場合は呼び出されます)、それが定義されていない場合、彼は間違いなく文句を言います。

HTH

于 2012-07-15T03:40:59.243 に答える
0

SDL フレームワークまたはライブラリとリンクしていないようです (ただし、パッケージ化されています)。

Xcode で、プロジェクト (ファイル ツリー ビューの上部) をクリックし、次にターゲットをクリックします。次に、[概要] タブをクリックします。そこに SDL フレームワークを追加します。

(.lib として提供される場合は、「-lsdl」などの追加のフラグをリンカーに追加する必要があります)。

SDL とのリンクは、未解決の外部を処理する必要があります。

于 2012-07-15T03:51:36.427 に答える