XCode 4.2静态库链接问题

时间:2011-12-27 00:53:44

标签: c++ xcode linker llvm

我有核心静态库,一些组件静态库,它们在 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链接正常。我甚至可以调用删除网格

我从未见过类似的东西!

3 个答案:

答案 0 :(得分:1)

确保以正确的顺序链接它们。

如果Component依赖于Core中的符号,那么Component需要在链接顺序中排在第一位,因此链接器知道要在Core中查找哪些符号。

在MSVC中,顺序无关紧要,但在大多数其他编译器套件中,顺序无关紧要。

答案 1 :(得分:1)

如果删除cMesh构造函数,那么您将使用提供给您的默认(无参数,无正文)cMesh构造函数。几乎听起来像cMesh构造函数中的某些代码会导致构建错误或缺少代码,因此实际上并未生成库,并且Xcode可能不会报告错误。 Xcode不擅长报告链接器错误。

我建议查看链接器所缺少的符号,并仔细检查它们是否在代码中实际定义。我的猜测是你在cMesh构造函数中使用了其中一个符号。很多时候使用虚拟基类,您可能忘记定义在子类中实现一个或两个方法。可能是因为缺少基于您的模板的方法,或者您的模板未正确#include。这可以编译得很好,但会导致链接器错误,就像你看到的那样。

如果Xcode没有显示完整的链接器错误,请显示Log Navigator(Command⌘ + 7 ),双击最后一个“Build”条目,选择错误,然后按选中时出现的行的最右侧按钮。符号应该列在那里。如果没有,那么终端的时间是xcodebuild

如果那种情况,我有兴趣看看是否为适当的架构构建库的结果,或者这可能会刺激一些进展:

  1. 在Xcode管理器Shift⇧ + 命令⌘ + 2 中,单击“项目”并找到项目的DerivedData路径。 / LI>
  2. 在终端中,导航到该目录(cd ~/Library/Developer/Xcode/DerivedData/proj-<random value>/
  3. 删除(或移开)Build目录(rm -r Build
  4. 在Xcode中,尝试使用cMesh构造函数进行构建。
  5. 查找图书馆产品文件(cd Build/Products/<scheme>-iphoneos
  6. 您编译的静态库(<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的设备。