由于架构不匹配,将静态库从 Xcode 链接到 Lazarus 应用程序失败
Posted
技术标签:
【中文标题】由于架构不匹配,将静态库从 Xcode 链接到 Lazarus 应用程序失败【英文标题】:Linking static library from Xcode into Lazarus app fails on architecture mismatch 【发布时间】:2015-03-02 22:57:57 【问题描述】:在这里进行大量研究并通过 Google 链接进行深入探索,但无济于事。
我用 OSX Xcode (5) 制作了一个简单的、一个函数的静态 C 库,我试图将其链接到 Lazarus 应用程序,基本上是将 Xcode 函数从 Xcode 移植到 Lazarus。
Xcode 可以构建静态库,我在 Lazarus 应用程序中似乎有正确的链接代码,如下所示:
type
byteptr = ^byte;
const
libname = 'libLORaudio.a';
function LORaudioPlay (fd : longint; audio : byteptr): Integer;
cdecl; external libname;
r := LORaudioPlay(e, z);
所有这些都编译得很好,但是构建失败并显示以下消息:
Id: symbol(s) not found for architecture i386
Id: Warning: ignoring file libLORaudio.a, file was built for archive which is not the architecture being linked (i386): libLORaudio.a
(and it goes on to say the function is undefined, of course, since it ignored the library that supplies it.)
我的问题可以通过两种方式中的任何一种来解决,但我都没有在网上或 Xcode 或 Lazarus 中找到足够的信息。
一种解决方案是让 Xcode 生成具有 Lazarus 预期架构的静态库。我已经尝试了各种选项来设置 Xcode 中的其他类似问题的答案中提到的构建架构,但似乎我没有正确完成它们,因为它们都不适合我。
另一个解决方案是让 Lazarus 接受 Xcode 生成的架构。 Laz.y 文档在这方面没有帮助。
我可以尝试任何建议吗?非常感谢您的考虑。
【问题讨论】:
我猜你已经为不同于 Lazarus/FPC 的架构(如警告文本中提到的 i386)编译了你的库。尝试在库的构建模式中设置 32 位架构。 @Abelisto 绝对是架构不匹配。我尝试了多种方法让 Xcode 接受 32 位架构规范,但它只接受原来的“i386 x86_64”。构建设置是否有一些后门? 不确定,我对 OS X 不熟悉。但是您也可以尝试在 Lazarus 项目选项(“配置和目标”页面)中更改目标操作系统和处理器。 Here你可以下载安装合适的FPC。据我了解,您需要fpc-2.6.4.intel-ppc64-macosx.dmg
(检查版本,它必须与已安装的FPC相同)。
【参考方案1】:
所以最终,我用 Finder 搜索并找到了(见下文)我分别在哪里构建了 x86_64 和 i386 目标文件来解决问题。这是通过将架构的构建设置更改为“i386”来完成的。 'x86_64' 的后续重建并未删除之前的 i386 对象信息。
然后我将 i386 目标文件复制到包含 Lazarus 项目的文件夹中(必须使用 alt-option 拖动方法进行复制,因为复制然后粘贴不起作用)。
在那里,我在终端中运行了 ar,如:'ar -r -s libname.a name.o' 以从对象构建静态库。
Lazarus 现在可以根据需要处理库。 (当然,这揭示了一些需要处理的其他错误情况,但是,嘿,进步发生了。)
Xcode 已将对象的两个版本都放在一个文件夹中。通过右键单击项目导航器中提到的产品并选择“在查找器中显示”,从 Xcode 中找到这些产品。您可以为当前拥有的任何架构执行此操作;两者都导致相同的构建文件夹。从那里通过包含文件夹的方式备份,直到您发现 Build。打开它并在包含的文件夹中继续前进,直到到达 Objects-normal。在那里你会找到 i386 和 x86_64 的文件夹。这些文件夹中的每一个都包含相应的对象文件,例如 name.o 以及其他与产品相关的文件。
【讨论】:
以上是关于由于架构不匹配,将静态库从 Xcode 链接到 Lazarus 应用程序失败的主要内容,如果未能解决你的问题,请参考以下文章
如何将 armv7s 架构添加到 xcode 7 / ios 9 中的静态库?
如何将 .a C 静态库添加到 Xcode 并在那里使用它? [复制]
Objective-C 在静态库中抛出异常。如何使用该库从程序中捕获异常?