我有核心静态库,一些组件静态库,它们在 Core 上传递,然后有一个应用链接核心和组件库。只要组件不使用中的类,我的应用就可以将核心和组件链接起来核心(应用使用核心中的类)。
我在armv6和armv7版本中都出现以下错误。所以我的问题不是每个人都非常流行的链接问题。
ld: symbol(s) not found for architecture armv6
clang: error: linker command failed with exit code 1 (use -v to see invocation)
我在组件中添加了对 Core 的引用,甚至将其添加到“Link Binary With Libraries”中,这对于静态lib来说不是必需的。
自从我开始遇到这个问题以来,我开始怀疑我的设计......它可能在动态链接环境中更有意义,但它仍然应该在静态环境中可行,特别是因为这已经在Windows下使用MSVC编译器< / em>的
修改 我取得了一些进展!虽然我仍然不知道该去哪里。
这是我的设置:
核心有一个类cResourceManager,它有一个模板化方法GetResource&lt; T&gt;(int id)
核心也有类cResource
组件具有继承cResource的类cMesh
以下是一些测试:
如果我尝试从应用调用rm-&gt; GetResource&lt; cMesh&gt;(...)我收到链接错误
如果我尝试从 App 构建cMesh,我会链接链接错误
如果我尝试从 App 调用将返回cMesh新实例的静态方法,我会收到链接错误
如果我注释掉cMesh的构造但是留下其他成员cMesh函数调用App链接正常。我甚至可以调用删除网格。
我从未见过类似的东西!
答案 0 :(得分:1)
确保以正确的顺序链接它们。
如果Component依赖于Core中的符号,那么Component需要在链接顺序中排在第一位,因此链接器知道要在Core中查找哪些符号。
在MSVC中,顺序无关紧要,但在大多数其他编译器套件中,顺序无关紧要。
答案 1 :(得分:1)
如果删除cMesh
构造函数,那么您将使用提供给您的默认(无参数,无正文)cMesh
构造函数。几乎听起来像cMesh
构造函数中的某些代码会导致构建错误或缺少代码,因此实际上并未生成库,并且Xcode可能不会报告错误。 Xcode不擅长报告链接器错误。
我建议查看链接器所缺少的符号,并仔细检查它们是否在代码中实际定义。我的猜测是你在cMesh
构造函数中使用了其中一个符号。很多时候使用虚拟基类,您可能忘记定义和在子类中实现一个或两个方法。可能是因为缺少基于您的模板的方法,或者您的模板未正确#include
。这可以编译得很好,但会导致链接器错误,就像你看到的那样。
如果Xcode没有显示完整的链接器错误,请显示Log Navigator(Command⌘ + 7 ),双击最后一个“Build”条目,选择错误,然后按选中时出现的行的最右侧按钮。符号应该列在那里。如果没有,那么终端的时间是xcodebuild
。
如果不那种情况,我有兴趣看看是否为适当的架构构建库的结果,或者这可能会刺激一些进展:
cd ~/Library/Developer/Xcode/DerivedData/proj-<random value>/
)rm -r Build
)cMesh
构造函数进行构建。cd Build/Products/<scheme>-iphoneos
)您编译的静态库(<libname>.a
)应该在此目录中。如果他们不在那里,他们就没有建造(除非你把你的产品放在别处)。如果你的库在那里,让我们确认它们实际上是为适当的架构而构建的。运行otool -vh <library>.a
。你应该看到类似的东西:
$ otool -vh libtesting.a
Archive : libtesting.a
libtesting.a(testing.o):
Mach header
magic cputype cpusubtype caps filetype ncmds sizeofcmds flags
MH_MAGIC ARM V7 0x00 OBJECT 3 1928 SUBSECTIONS_VIA_SYMBOLS
如您所见,我的测试库是为ARMv7构建的。
答案 2 :(得分:0)
我不认为Clang会为armv6生成代码,如果您要定位那些旧版仍需要使用GCC的设备。