我如何针对在xcode / clang / macos中使用libc ++编译的静态库编译应用程序?

时间:2013-02-10 23:00:47

标签: c++ xcode static-libraries clang libc++

当我尝试编译测试控制台应用程序以测试同一工作区上的静态库的某些功能时,我在二进制文件的链接阶段遇到问题,只有在我选择使用libc ++标准库时才会发生。 / p>

缺少的符号错误如下:

    Undefined symbols for architecture x86_64:
  "std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::empty() const", referenced from:
      libtorrent::torrent::replace_trackers(std::__1::vector<libtorrent::announce_entry, std::__1::allocator<libtorrent::announce_entry> > const&) in libLibOFFTorrent-xcode.a(torrent.o)
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

error in xcode missing symbols on a static library

当我在两个目标中选择stdlibc ++时,一切都编译正常,运行正常。

standar library options (xcode)

我的问题是:

  1. 在静态库上使用libc ++有一些限制吗?
  2. 它是apple / clang ++链接器工具中的一个错误?
  3. 如何配置项目以使用libc ++和我的静态 库?
  4. 为什么链接器工具找不到标准c ++的符号 静态库上的库?(任何其他依赖的库是针对libc ++编译的)
  5. 我应该忘记使用libc ++的想法吗?
  6. 注释:

    1. 静态库依赖于libboost_system,我用libc ++和libstdc ++编译了相同的结果
    2. 当我使用'bjam'工具运行测试时,它运行正常,也许jam文件选择libstdc ++来编译文件。
    3. 我知道更改标准库会修复链接问题,我只想知道为什么会这样。
    4. UPDATE :当我在静态lib项目中删除对string :: empty的引用时,依赖于使用libc ++编译并运行的项目,但它会进入无限循环。

      UPDATE 2 :删除string :: empty引用当我使用libstdc ++编译整个文件时没有任何效果它运行正常。没有循环,这让我觉得这是一个错误或类似的东西。

      更新3 :编译时,这是程序无限循环的地方:enter image description here

2 个答案:

答案 0 :(得分:1)

似乎您的某个依赖项(libtorrent)已针对libstdc++构建。

检查命名空间:std::__1::basic_string。它具有__1前缀,通常表示libstdc++)。

我可能错了,但如果你绝对想要使用这个,我认为你需要重建libtorrent libc++

请注意,使用stdlibc++

非常常见

答案 1 :(得分:0)

您是否有机会使用-D_LIBCPP_INLINE_VISIBILITY =“”编译libtorrent?

我问的原因是std::string::empty()不在libc ++。dylib中,因为它标有“always_inline”。因此,当它被使用时,它本应被内联到libtorrent中。