2012-07-15 86 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链接应照顾您未解决的外部问题。