为什么Leopard会使用$ non_lazy_ptr修改一些符号? 更重要的是,修复未定义的符号错误的最佳方法是什么,因为符号已经被$ non_lazy_ptr修改了?

===============>>#1 票数:5

来自: 开发人员连接 - 间接寻址

间接寻址是代码生成技术的名称,该技术允许从一个文件中定义的符号从另一个文件引用,而不需要引用文件明确知道定义该符号的文件的布局。 因此,可以独立于引用文件修改定义文件。 间接寻址最大限度地减少了动态链接器必须修改的位置数量,这有助于代码共享并提高性能。

当文件使用在另一个文件中定义的数据时,它会创建符号引用。 符号引用标识从中导入符号的文件和引用的符号。 有两种类型的符号引用:非惰性和惰性。

加载模块时,动态链接器将解析非绑定符号引用(绑定到它们的定义)。 非惰性符号引用本质上是符号指针 - 指针大小的数据。 编译器为数据符号或函数地址生成非语义符号引用。

惰性符号引用在第一次使用时(而不是在加载时)由动态链接器解析。 对引用符号的后续调用直接跳转到符号的定义。 延迟符号引用由符号指针和符号存根组成,这些代码直接解引用并跳过符号指针。 编译器在遇到对另一个文件中定义的函数的调用时会生成惰性符号引用。

===============>>#2 票数:3

在人类说话中:编译器生成附加了$ non_lazy_ptr的存根以加速链接。 你可能会看到从_Foo $ non_lazy_ptr引用的函数Foo是未定义的,或类似的东西 - 这些都不是一回事。 确保在您将应用程序链接到的目标文件/库中实际声明和导出符号。 至少那是我的问题,我还认为这是一个奇怪的链接器事情,直到我发现我的问题在其他地方 - 在Google上发现了其他几个可能的原因。

===============>>#3 票数:2

ranlib -c libwhatever.a

是一个坚实的解决方案。 构建iOS的PJSIP库时遇到了同样的问题。 这个库使用基于autoconf的make系统,但需要对各种文件进行一些调整才能使iOS的一切正常。 在这样做的过程中,我设法删除了规则库中的ranlib行,然后开始在我的项目链接中_PJ_NO_MEMORY_EXCEPTION关于_PJ_NO_MEMORY_EXCEPTION$non_lazy_ptr引用的_PJ_NO_MEMORY_EXCEPTION$non_lazy_ptr未定义的错误。

将ranlib行添加回库文件解决了这个问题。 现在我在rules.mak中完整输入了LIBS

$(LIB): $(OBJDIRS) $(OBJS) $($(APP)_EXTRA_DEP)
    if test ! -d $(LIBDIR); then $(subst @@,$(subst /,$(HOST_PSEP),$(LIBDIR)),$(HOST_MKDIR)); fi
    $(LIBTOOL) -o $(LIB) $(OBJS)
    $(RANLIB) -c $(LIB)

希望这有助于其他人尝试在iPhone或iOS上使用通用UNIX配置的外部库。

===============>>#4 票数:1

如果其他人遇到了我遇到的同样问题:

有一个extern NSString* const someString; 在头文件中,但忘了把它放在实现文件中。 as NSString* const someString=@"someString";

这解决了它。

===============>>#5 票数:0

库文件上的ranlib -c可以解决问题

  ask by translate from so

未解决问题?本站智能推荐:

1回复

使用xcode 4但针对OSX Leopard(10.5)及更高版本

我正在开发一个使用xcode 4定位到雪豹(10.6)的应用程序。现在,在开发快结束时,我被要求支持10.5+。 我已将Mac OS部署目标设置为10.5并进行了编译。 编译器(LLVM 2.0)和链接器似乎对该更改感到满意,但是我遇到了我从NSWindow(isOnActiveSpac
1回复

$ non_lazy_ptr与agvtool版本变量的链接错误?

我一直按照一般原则将agvtool用于我的iPhone应用程序中,最近发现了一个我希望能够检查版本变量的原因(以便我可以将帮助内容重新复制到Documents目录中,如果它是过时)。 在构建过程中会自动生成MyAppVersionNumber中定义的变量MyAppVersionNumber 。
1回复

使用libav *库在xcode 4中构建时,非法文本重定向到non_lazy_ptr错误

我正在尝试构建一个在xcode 4中使用ffmpeg的libav *库并获得以下错误的简单应用程序: ld:非法文本从/ffmpeg/temp/ffmpeg-0.8/builduni/lib/libavcodec.a(ac3.o)中的non_lazy_ptr重新定位到_ff_ac3_bit
3回复

XCode 3.2可以在10.5 Leopard上运行吗?

XCode 3.2可以在10.5.x Leopard上运行吗? 或者它只适用于Snow Leopard(10.6)?
1回复

§non_lazy_ptriPhone SDK 3.0

在sdk 3.0中构建iphone 2.2.1应用程序后,我收到许多§non_lazy_ptr类型的错误。 我正在CFFTPStream常量上获取它,例如kCFStreamPropertyFTPPassword和kCFStreamPropertyUserName。 有人知道是什么原因造成的吗
2回复

如果TECGetTextEncodingFromInternetName()需要Pascal样式的字符串,为什么在OSX 10.5中停止使用CopyCStringToPascal()?

我有责任为OSX 10.5构建旧版本的开源库。 (该库是Xerces 2.8。) 由于(除其他外)使用已停用的OSX函数CopyCStringToPascal()该库无法在OSX 10.5上构建开箱即用的功能。 相关的代码段是: 调查显示, CopyCStringToPasca
2回复

XCode 4.2可以在10.5 Leopard上运行吗?

XCode 4.2可以在10.5 Leopard上运行吗? 还是仅适用于Snow Leopard(10.6)或Lion(10.7)?
3回复

如何在Mac OS X 10.5 Leopard上设置PEAR

我最终尝试安装PEAR,因此我可以轻松安装PHPUnit。 我想建立一个Mac,Apache,MySQL,PHP,PHPUnit开发环境,以便我可以在本地进行测试。 我已经有Apach,MySQL和PHP工作了。 现在我只需要PHPUnit,这意味着我需要PEAR来安装它。 我已经搜
7回复

如何从OSX Leopard卸载python以便我可以使用MacPorts版本?

我想使用python的macports版本而不是Leopard附带的版本。
2回复

OSX Leopard-限制共享Internet连接

我正在运行Core Duo Macbook pro,并且正在尝试通过wifi互联网连接共享为连接的设备模拟3G连接。 我尝试了一些选项(例如Speedlimit),但它们仅影响macbook的浏览器,而不影响连接的设备。 还有其他选择吗? 我正在使用豹子,因为任何更现代的东西都会使系统过热