当我尝试编译测试控制台应用程序以在同一个工作区上的静态库上测试某些功能时,我遇到了二进制的链接阶段中的问题,它仅在我选择使用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)
当我选择在这两个目标都编译好的stdlibC++,它运行正常。
我的问题是:
- 有关于静态库使用的libC++的一些限制?
- 它在苹果/铛++链接器工具中的错误?
- 如何配置项目以使用libC++和我的静态 库?
- 为什么链接器工具不会找到一个静态库一个标准的C++ 库的符号?
- 我应该忘记使用的libC++的想法(这取决于编译反对的libC++其他LIB)?
笔记:
- 静态库取决于libboost_system,巫婆我曾与libc中++和libstdC++相同的结果编译
- 当我运行与“bjam的”工具的测试运行正常,也许jam文件选择libstdC++来编译这些文件。
- 我知道改变标准库修复链接问题,我只想知道为什么。
UPDATE:当我删除提及字符串::在静态库项目,这取决于编译与libc中++罚款和运行项目空的,但它在一个无限循环获取。
UPDATE 2:删除字符串::空引用导致没有影响,当我用libstdC++编译整个事情它运行良好。没有循环,这让我觉得这是一个错误或类似的东西。
更新3:当它编译这就是程序无限期循环的地方:
libtorrent是我在xcode的工作区中设置的静态库,它是用libC++编译的(截图是从libtorrent的设置开始的),当我用libstdC++编译它时,一切正常,我重建了lib a很多次。这很奇怪。生病尝试删除对string :: empty()的调用以查看会发生什么。 – alter 2013-02-11 01:01:40