2013-05-19 104 views
5

我在這裏面臨一個奇怪的問題,我試圖將libkml C++ project sources整合到我的iOS項目中。該項目編譯獨立罰款,但是當涉及到通過該行的代碼鏈接:未找到適用於i386體系結構的符號 - 但適用於iOS設備

kmldom::PointPtr appPoint = kmlconvenience::CreatePointLatLon(appLocation.coordinate.latitude, appLocation.coordinate.longitude); 

我得到的鏈接錯誤只有當我建立它模擬器。它正常工作時,我建立它的iOS設備,但對於模擬器我得到了以下3個連接錯誤:

(null): "kmldom::GxTimeSpan::GxTimeSpan()", referenced from: 

(null): Kmldom::KmlFactory::CreateGxTimeSpan() const in libLibKML.a(kml_factory.o) 

(null): "kmldom::GxTimeStamp::GxTimeStamp()", referenced from: 

(null): Kmldom::KmlFactory::CreateGxTimeStamp() const in libLibKML.a(kml_factory.o) 

(null): Symbol(s) not found for architecture i386 

(null): Linker command failed with exit code 1 (use -v to see invocation) 

These errors occur only when I try to build for simulator

我可能是罰款與單獨的設備開發,但我期待解決這個問題問題有兩個原因:

  1. 對於開發目的,團隊可以很容易地使用模擬器。
  2. 我真的很想深入瞭解它,並理解爲什麼會在第一種情況下發生。爲什麼它針對設備構建,並且對於模擬器失敗,儘管目標是相同的,目標中包含的源文件在模擬器以及設備?中是相同的。

GXTimeStamp和GXTimeSpan類的定義是在頭文件gx_timeprimitive.h這就是內容:

#ifndef KML_DOM_GX_TIMEPRIMITIVE_H__ 
#define KML_DOM_GX_TIMEPRIMITIVE_H__ 

#include <string> 
#include "kml/base/xml_namespaces.h" 
#include "kml/dom/kml22.h" 
#include "kml/dom/object.h" 
#include "kml/dom/timeprimitive.h" 

namespace kmldom { 

class Serializer; 
class Visitor; 

// <gx:TimeSpan> 
class GxTimeSpan : public TimeSpan { 
public: 
    virtual ~GxTimeSpan(); 
    static KmlDomType ElementType() { 
    return Type_GxTimeSpan; 
    } 
    virtual KmlDomType Type() const { return Type_GxTimeSpan; } 
    virtual bool IsA(KmlDomType type) const { 
    return type == Type_GxTimeSpan || TimeSpan::IsA(type); 
    } 

    // Visitor API methods, see visitor.h. 
    virtual void Accept(Visitor* visitor); 

private: 
    friend class KmlFactory; 
    GxTimeSpan(); 
    LIBKML_DISALLOW_EVIL_CONSTRUCTORS(GxTimeSpan); 
}; 

// <gx:TimeStamp> 
class GxTimeStamp : public TimeStamp { 
public: 
    virtual ~GxTimeStamp(); 
    static KmlDomType ElementType() { 
    return Type_GxTimeStamp; 
    } 
    virtual KmlDomType Type() const { return Type_GxTimeStamp; } 
    virtual bool IsA(KmlDomType type) const { 
    return type == Type_GxTimeStamp || TimeStamp::IsA(type); 
    } 

    // Visitor API methods, see visitor.h. 
    virtual void Accept(Visitor* visitor); 

private: 
    friend class KmlFactory; 
    GxTimeStamp(); 
    LIBKML_DISALLOW_EVIL_CONSTRUCTORS(GxTimeStamp); 
}; 

} // end namespace kmldom 

#endif // KML_DOM_GX_TIMEPRIMITIVE_H__ 

我看了很多帖子說怎麼把源文件編譯沒有出現鏈接錯誤。我也在同樣的思路解決這個問題,但是我不能將這個頭文件包含到編譯源文件中,因爲它是一個.h文件。

另外,我仔細檢查了 - kml_factory.cc文件包括在內部項目的編譯來源:

kml_factory.cc file included in compile phase

期待的建議和幫助。謝謝。

+0

您正在使用什麼版本的Xcode? –

+0

我正在使用4.6.2 –

回答

3

讓我感到很愚蠢的說這個,但是,我不知道如何gx_timeprimitive.cc文件丟失。我的印象是gx_timeprimitive。.h文件完全,由本身具有虛擬課堂,我試圖通過提供空的實現在私人範圍的構造函數,像這樣來定義GXTimeSpan和GXTimeStamp類:

class GxTimeSpan : public TimeSpan { 
public: 
    virtual ~GxTimeSpan(); 
    static KmlDomType ElementType() { 
    return Type_GxTimeSpan; 
    } 
    virtual KmlDomType Type() const { return Type_GxTimeSpan; } 
    virtual bool IsA(KmlDomType type) const { 
    return type == Type_GxTimeSpan || TimeSpan::IsA(type); 
    } 

    // Visitor API methods, see visitor.h. 
    virtual void Accept(Visitor* visitor); 

private: 
    friend class KmlFactory; 
    GxTimeSpan() 
    { 

    } 
    LIBKML_DISALLOW_EVIL_CONSTRUCTORS(GxTimeSpan); 
}; 

但儘管如此,編譯器會不會產生目標文件超出接口文件(.h文件從編譯源中排除,它們只包含所有聲明),因此鏈接程序找不到它需要的構造函數。這使我在互聯網上搜索gx_timeprimitive.cc文件,它確實可用。

用冷靜的頭腦思考可以爲我節省100個獎勵積分,但我有一個教訓!

此外,要回答爲什麼它僅在模擬模式給錯誤: 其實行我上面提到的 - kmldom::PointPtr appPoint = kmlconvenience::CreatePointLatLon(appLocation.coordinate.latitude, appLocation.coordinate.longitude); 時對ARMv7建,我認爲,除非該變量appPoint在代碼鏈接的其他地方使用跳過鏈接它與libkml的目標文件的來源。而i386將執行鏈接,而不管該變量是否在代碼中使用。我想這是某種編譯器優化,因爲它的行爲在各自的體系結構中是不同的。正是這個謎題讓我錯過了尋找丟失文件的關鍵線索!

對於那些花時間解決我這個愚蠢問題的人們的歉意,謝謝大家。

2

這可能類似於iOS symbols not found for architecture i386

這裏是最相關的要點:

在構建庫,框架或應用程序適用於iOS,XCode中只會編譯爲目標構建設置中指定的架構目標代碼。 XCode也將只鏈接到具有內置指定架構的二進制文件。

在iOS模擬器中運行代碼時,您正在i386架構的桌面上運行代碼。

如果你運行你需要確保你的應用程序及其所有依賴庫已建成i386架構的simluator iOS應用程序缺少的i386架構錯誤。

+0

我的代碼中包含了libkml源代碼,這意味着libkml庫將用於在構建主項目之前選擇的體系結構。此外,libkml僅依賴於一個外部庫 - Expat庫,我已經在外部編譯了這個庫,並且創建了一個可以跨i386以及ARMv7鏈接的胖庫。而且,Expat庫在這裏沒有提出問題,正如我的問題所指出的那樣,問題出在libkml源代碼的某處。仍試圖找出什麼是錯的,謝謝你的建議。 –

相關問題