2012-07-15 89 views
0

我在我的Mac上構建一個基於Windows的項目。我已經固定了很多錯誤,但是當我去編譯它提供了以下錯誤:錯誤的架構C++? Xcode 4.3

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是矢量,僅僅是明確的。

感謝

回答

0

如果遇到連接錯誤,這意味着編譯器可以找到聲明但是鏈接找不到定義

我想你已經知道了,但只是在案例:

一種方法,該聲明只是它的簽名 如:

class foo 
{ 
    public: 
     void bar(); 
} 

這是方法的聲明「無效美孚::酒吧()」,並進入一個頭文件(.H,.HPP,...)

現在這個方法的定義包含身體也是如此。它必須符合聲明。同樣的例子:

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

這是方法的定義 「無效美孚::酒吧()」,它(一般)進入一個源文件(的.cpp,.CXX,...)

在你的情況下,編譯器找到了解鏈,但鏈接器找不到定義。因此,您必須找到Timer :: reset()的定義位置,並檢查該位置是否可用於鏈接器。

最典型的原因是Timer :: reset()在cpp文件中定義,並且該文件不包含在xcode項目中(不要擔心,如果不沒有一個好的構建配置工具,如Premake,Cmake或其他...)

在這種情況下,符號將被聲明,因爲你的代碼中有#include「timer.h」或類似的東西,但未定義,因爲匹配的cpp不包含在您的項目中。它(可能)存在於您的硬盤上,但它並未在您的項目中引用。

要解決這個問題:

  1. 查一查其中定時器::復位被定義
  2. 如果它沒有定義anywherem那麼你只要找到你的問題。它如果它被稱爲被定義
  3. 如果它的定義,然後檢查CPP包含在你的項目中,同一模塊的main.cpp中

你提到它僅發生於特定的功能。我可能會補充說,如果一個函數從未被調用過,你將不會得到這個錯誤。你是否只有在main.cpp中實際調用的函數有這個錯誤信息?

有關詳細信息:

據我所知(我可能是錯的,因爲這不是一個情況,我通常碰到)編譯器處理一個文件的時間和它是完全合法的有一些聲明,但沒有定義在編制階段

鏈接器將所有的文件togetherm所以如果使用符號(叫,你的情況),並且它沒有被定義(畢竟它可以在另一個文件中定義),他肯定會抱怨。

HTH

+0

我可能詳細說明了很多你已經知道的事情,但是對於其他人來說可能是有用的,誰知道呢? :) – Dinaiz 2012-07-15 03:47:59

0

你看上去不與SDL的框架或庫(但它被打包)的鏈接。

在Xcode中,單擊您的項目(文件樹視圖頂部),然後單擊您的目標。然後單擊摘要選項卡。這就是您添加SDL框架的地方。

(如果它以.lib的形式出現,則需要爲鏈接器添加一個額外的標記,例如「-lsdl」)。

與SDL鏈接應照顧您未解決的外部問題。