2013-02-10 78 views
3

当我尝试编译测试控制台应用程序以在同一个工作区上的静态库上测试某些功能时,我遇到了二进制的链接阶段中的问题,它仅在我选择使用libC++标准库时发生。我如何编译一个应用程序针对在xcode/clang/macos中用libC++编译的静态库?

丢失的符号错误是如下:

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. 它在苹果/铛++链接器工具中的错误?
  3. 如何配置项目以使用libC++和我的静态 库?
  4. 为什么链接器工具不会找到一个静态库一个标准的C++ 库的符号?
  5. 我应该忘记使用的libC++的想法(这取决于编译反对的libC++其他LIB)?

笔记:

  1. 静态库取决于libboost_system,巫婆我曾与libc中++和libstdC++相同的结果编译
  2. 当我运行与“bjam的”工具的测试运行正常,也许jam文件选择libstdC++来编译这些文件。
  3. 我知道改变标准库修复链接问题,我只想知道为什么。

UPDATE:当我删除提及字符串::在静态库项目,这取决于编译与libc中++罚款和运行项目空的,但它在一个无限循环获取。

UPDATE 2:删除字符串::空引用导致没有影响,当我用libstdC++编译整个事情它运行良好。没有循环,这让我觉得这是一个错误或类似的东西。

更新3:当它编译这就是程序无限期循环的地方:enter image description here

回答

1

看来你的依赖(libtorrent)中的一个已建成对libstdc++

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

我可能是错的,但我认为你需要重建libtorrentlibc++如果你绝对要使用这一个。

请注意,使用stdlibc++的情况很常见。

+0

libtorrent是我在xcode的工作区中设置的静态库,它是用libC++编译的(截图是从libtorrent的设置开始的),当我用libstdC++编译它时,一切正常,我重建了lib a很多次。这很奇怪。生病尝试删除对string :: empty()的调用以查看会发生什么。 – alter 2013-02-11 01:01:40

0

你有没有用-D_LIBCPP_INLINE_VISIBILITY =“”编译libtorrent?

我问的原因是std::string::empty()不在libC++。dylib中,因为它被标记为“always_inline”。所以它在使用时应该被内联到libtorrent中。

+0

不,编译它时,我得到了很多未解决的符号错误。所有与字符串相关的东西,暂时使用libstdC++。 – alter 2013-02-11 12:50:03

+0

好吧,我不建议你使用那个标志。的确,我建议你不要。顺便说一下,'std :: __ 1'符号来自libC++,而不是libstdC++。 – 2013-02-11 15:11:22

+0

我注意到,我早就做了这个测试,我知道std :: __ 1来自libC++,这就是为什么非常奇怪。正如我在这个问题的更新中所说的那样,我能够编译和运行测试,但它在向量类中的一些方法上挂起来了,我不期待在这个问题上,但不幸的是很高兴知道为什么发生这种情况。 – alter 2013-02-11 16:35:38