- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我尝试使用 Xcode 5.0 Objective-C 项目中的 libtorrent 库但没有成功。
我已经使用 LLVM 5.0 从源构建了 boost 1.54 和 libtorrent-rasterbar(最新),没有问题。此外,通过 MacPorts,我获得了 pkg-config 以获得 libtorrent-rasterbar 库的正确 cflags。从我的build设置中,pkgconfig 库和 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“Linker Flags”和“C/C++ Flags”设置中。
不幸的是,我无法让调用的函数正确链接。这是我在 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]);
链接器找不到符号,输出为:
Undefined symbols for architecture x86_64:
"libtorrent::parent_path(std::__1::basic_string, std::__1::allocator > const&)", referenced from: 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)", referenced from: libtorrent::add_files(libtorrent::file_storage&, std::__1::basic_string, std::__1::allocator > const&, unsigned int) in createpackage.o
"libtorrent::complete(std::__1::basic_string, std::__1::allocator > const&)", referenced from: 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&)", referenced from: libtorrent::add_files(libtorrent::file_storage&, std::__1::basic_string, std::__1::allocator > const&, unsigned int) in createpackage.o ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation)
我很困惑。检查 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 中正确的目标配置中。
最佳答案
终于,问题解决了。
让我们检查比较生成的目标文件和 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++ 解决了这个问题。
关于c++ - 从 Objective-C 链接 C++ 库 (libtorrent),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19020724/
编译libtorrent教程时'hello world'与: g++ main.cpp -o run -ltorrent-rasterbar -lboost_filesystem-mt -L/usr/
是否有人为洪流创建了填充文件? 如今有多少客户使用这些东西? “填充文件”是否全面? 我在ctorrent,trent,trasmission等新客户中没有发现此功能。 您是否具有此功能的实现或有关此
当我尝试使用 VIsual studio 9.0 进行构建时,我正在为我的应用程序使用提升,我得到1>LINK: fatal error LNK1104:无法打开文件“libtorrent.lib”
在 Libtorrent session 中有一些 enurm,我对如何设置 enurm 有点困惑,例如: struct session_settings { enum s
我如何正确转发声明一个类? //client_functions.cpp using namespace libtorrent; session Sess; bool Start_Client_Ses
我正在使用 libtorrent 将数据传输到 10k+ 个节点。这里我传输的数据非常小(大小为 10-50 MB)。我希望所有节点都将数据保存在内存中,直到所有其他节点完成下载以避免更多的磁盘 io
是否可以通过分配托管文件的服务器的 IP 地址来绕过跟踪器来制作 torrent 文件? 我对通过 libtorrent 的 bittorrents 文件传输协议(protocol)很感兴趣,他们以这
我正在尝试生成一个 torrent 并使用 python libtorrent 为其提供种子,它会生成 torrent,但不会为其提供种子。 我在 Ubuntu 14.04 上使用 libtorren
我有一个问题。我不是 C/C++ 程序员,libtorrent 文档对我来说并不是很清楚。没有像 libtorrent 的 python 文档那样的文档可供查找。 此刻,我尝试在 stackoverf
我使用add_magnet_uri获取信息,但是有一些资源响应慢,我应该使用什么来设置总超时时间? http://www.rasterbar.com/products/libtorrent/manua
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
使用 Rasterbar libtorrent 我不希望下载的数据放在我的硬盘驱动器上,而是放在管道或变量或其他软件上,所以我可以将它重定向到其他地方,Mysql,如果不是我想要的,甚至是垃圾,是如果
我想在开始下载之前设置上传/下载限制。对于前。目前我正在设置下载/上传限制,如下所示: info = lt.torrent_info(ft['torrent_info']) params = { 's
当通过 libtorrent(C++ 库)下载 torrent 时,会创建一个以 torrent 名称命名的文件夹,所有文件都下载到该文件夹中。例如,在 uTorrent 中,您可以在添加 tor
我想使用 libtorrent-rasterbar 来开发一些 torren 测试,但是当我尝试编译包中的示例时,我遇到了这个错误: g++ dump_torrent.cpp In file i
我已经在客户端开发了 torrent 程序,并使用 rutorrent 作为种子文件。我在 rutorrent 中使用插件 peer 来监控使用我的 torrent 应用程序的数字客户端。但在客户端选
我正在尝试设置 session 设置,但出现了一个我不太明白的错误,我能够正常设置 session ,根据 Libtorrent 文档,我只是将 session_settings 结构传递给 set_
我刚刚使用源代码编译并安装了 boost $密码 /Downloads/boost_1_58_0 ./b2 threading=multi link=static runtime-link=stati
据我所知,当播种或下载 Torrent 时,您的 IP 在跟踪器上并且会保留几个小时或几天 我如何使用 Libtorrent 手动告诉我的跟踪器我不再连接到跟踪器它应该忘记我的 IP,因为我既不播种也
我试图让 Session_Status 更新,但由于某种原因,结构的值永远不会更新, session 是这样启动的: using namespace libtorrent; session* Se
我是一名优秀的程序员,十分优秀!