gpt4 book ai didi

c++ - 找不到架构 i386 的符号 - 但适用于 iOS 设备

转载 作者:可可西里 更新时间:2023-11-01 04:39:53 25 4
gpt4 key购买 nike

我在这里面临一个奇怪的问题,我正在尝试整合 libkml C++ project sources进入我的 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

期待建议和帮助。谢谢。

最佳答案

让我觉得这么说很愚蠢,但是,我不知道 gx_timeprimitive.cc 文件是怎么丢失的。我的印象是 gx_timeprimitive.h 文件本身是完整的,因为它有虚拟类,我试图通过在私有(private)范围内提供构造函数的空实现来定义 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);
};

但是,编译器仍然不会从接口(interface)文件中创建目标文件(.h 文件被排除在编译源之外,它们只包含所有声明),因此链接器无法找到它需要的构造函数。这让我在互联网上搜索 gx_timeprimitive.cc 文件,它确实可用。

冷静思考本来可以节省 100 赏金点数,但我要上一课!

此外,要回答为什么仅在模拟器模式下会出错:实际上我上面提到的那一行 -kmldom::PointPtr appPoint = kmlconvenience::CreatePointLatLon(appLocation.coordinate.latitude, appLocation.coordinate.longitude);当为 ARMv7 构建时,我认为,除非变量 appPoint 在代码的其他地方使用,否则链接器会跳过将它与 libkml 目标文件的源链接。然而,i386 将执行链接,而不管该变量是否在代码中使用。我想这是某种编译器优化,由于其行为在各自的体系结构中是不同的。正是这个谜题让我错过了寻找丢失文件的关键线索!

对那些花时间解决我这个愚蠢问题的人表示歉意,谢谢大家。

关于c++ - 找不到架构 i386 的符号 - 但适用于 iOS 设备,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16637485/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com