2

我正在尝试使用 Xcode 5.0 Objective-C 项目中的 libtorrent 库但没有成功。

我已经使用 LLVM 5.0 从源代码构建了 boost 1.54 和 libtorrent-rasterbar(最新),这没有问题。此外,通过 MacPorts,我获得了 pkg-config 以获得 libtorrent-rasterbar 库的正确 cflags。从我的构建设置中,pkgconfig libs 和 cflags 的输出是:

      -DTORRENT_USE_OPENSSL -DWITH_SHIPPED_GEOIP_H 
-DBOOST_ASIO_HASH_MAP_BUCKETS=1021 
    -DBOOST_EXCEPTION_DISABLE -DBOOST_ASIO_ENABLE_CANCELIO 
    -DBOOST_ASIO_DYN_LINK -DTORRENT_LINKING_SHARED -I/usr/local/include 
    -I/usr/local/include/libtorrent 

    -L/usr/local/lib -ltorrent-rasterbar 

自然,我将这些参数添加到 Xcode 的“链接器标志”和“C/C++ 标志”设置中。

不幸的是,我无法让我调用的函数正确链接。这是我在 testclass.cpp 文件中编写的示例类:

#include "libtorrent/entry.hpp"
#include "libtorrent/bencode.hpp"
#include "libtorrent/torrent_info.hpp"
#include "libtorrent/file.hpp"
#include "libtorrent/storage.hpp"
#include "libtorrent/hasher.hpp"
#include "libtorrent/create_torrent.hpp"

void testclass::addFilesFromPath(const char* path)
{
    libtorrent::file_storage fs;
    libtorrent::add_files(fs, path);
}

试图从 createpackage.mm 文件中调用:

testclass* pPackage = new testclass();
testclass->addFilesFromPath([_sessionDir UTF8String]);

链接器找不到符号,输出为:

架构 x86_64 的未定义符号:
“libtorrent::parent_path(std::__1::basic_string, std::__1::allocator > const&)”,引用自:libtorrent::add_files(libtorrent::file_storage&, std::__1: :basic_string, std::__1::allocator > const&, unsigned int) in createpackage.o
"libtorrent::detail::add_files_impl(libtorrent::file_storage&, std::__1::basic_string, std::__1::allocator > const&, std::__1::basic_string, std::__1::allocator > const&, boost::function, std::__1::allocator >)>, unsigned int)”,引用自:libtorrent::add_files(libtorrent ::file_storage&, std::__1::basic_string, std::__1::allocator > const&, unsigned int) 在 createpackage.o
“libtorrent::complete(std::__1::basic_string, std::__1::allocator > const&)”,引用自:libtorrent::add_files(libtorrent::file_storage&, std::__1::basic_string, std:: __1::allocator > const&, unsigned int) in createpackage.o
"libtorrent::filename(std::__1::basic_string, std::__1::allocator > const&)",引用自:libtorrent::add_files(libtorrent: :file_storage&, std::__1::basic_string, std::__1::allocator > const&, unsigned int) in createpackage.o ld:未找到架构 x86_64 的符号 clang:错误:链接器命令失败,退出代码为 1 (使用 -v 查看调用)

我很困惑。检查 libtorrent-raster bar 架构是 x86_64。此外,boost 构建良好。我是这种 C++ / Objetive-C 代码混合方法的新手。

谢谢。

编辑1:

我采用了最小的样本。制作了以下CPP文件:

#include "libtorrent/file.hpp"
#include "libtorrent/storage.hpp"
#include "libtorrent/create_torrent.hpp"

int main()
{
    libtorrent::file_storage fs;
    libtorrent::add_files(fs, ".");
}

在命令行,尝试:

c++ test.cpp $(pkg-config /usr/local/lib/pkgconfig/libtorrent-rasterbar.pc --cflags --libs) -lboost_system

构建成功。所以我想知道如何将所有 pkg​​-config 数据放入 OSX 中的正确目标配置中。

4

1 回答 1

3

最后,问题解决了。

让我们检查比较生成的目标文件和 libtorrent 库中包含的符号的符号。

nm createpackage.o|grep 'add_files'
                 U __ZN10libtorrent6detail14add_files_implERNS_12file_storageERKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEESB_N5boost8functionIFbS9_EEEj
00000000000002a0 S __ZN10libtorrent9add_filesERNS_12file_storageERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEj
00000000000018e0 S __ZN10libtorrent9add_filesERNS_12file_storageERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEj.eh

与之比较:

$ nm libtorrent-rasterbar.a | grep 'add_files'
00000000000002f0 T __ZN10libtorrent6detail14add_files_implERNS_12file_storageERKSsS4_N5boost8functionIFbSsEEEj
0000000000006e68 S __ZN10libtorrent6detail14add_files_implERNS_12file_storageERKSsS4_N5boost8functionIFbSsEEEj.eh

许多人可以想象看到该输出的不同之处在于,我正在为我的 .mm 文件使用 LLVM 标准 C++ 库,而 libtorrent 是使用 GCC Stdlib 编译的,这就是不同符号引用 char_traits、basic_string 等的原因。

因此,将 XCode Build Settings > Standard C++ Library 更改为 libstdc++ 解决了这个问题。

于 2013-10-01T21:47:15.337 回答