当前位置: 首页 > 知识库问答 >
问题:

从Objective-C链接C++库(libtorrent)

法烨华
2023-03-14

我试图使用Xcode5.0Objective-C项目中的libtorrent库,但没有成功。

我使用LLVM5.0从源代码中构建了boost 1.54和libtorrent-rasterbar(最新),没有任何问题。此外,通过MacPorts,我获得了pkg-config以获得libtorrent-rasterbar库的适当cflags。从我的生成设置中,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“链接器标志”和“C/C++标志”设置中。

#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&)”,引用自CreatePackage.o中的:libtorrent::add_files(libtorrent::file_storage,std::__1::basic_string,std::__1::allocator>const&,unsigned int)
“createPackage.o中的libtorrent::add_files(libtorrent::file_storage&,std::__1::basic_string,std::__1::allocator>const&,unsigned int)ld:找不到体系结构x86_64的符号clang:error:链接器命令失败,退出代码为1(使用-v查看调用

我很迷惑。检查libtorrent-raster bar体系结构是否为x86_64。此外,boost构建良好。我对这种C++/objective-C代码混合方法是新手。

多谢了。

编辑1:

#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中正确的目标配置中。

共有1个答案

严曜文
2023-03-14

问题终于解决了。

让我们比较生成的对象文件和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
 类似资料:
  • Objective-C,通常写作 ObjC 和较少用的 Objective C 或 Obj-C,是扩充 C 的面向对象编程语言。它主要使用于 Mac OS X 和 GNUstep 这两个使用 OpenStep 标准的系统,而在 NeXTSTEP 和 OpenStep 中它更是基本语言。Objective-C 可以在 gcc 运作的系统写和编译,因为 gcc 含 Objective-C 的编译器。

  • 问题内容: 我想使用Cocoa + Objective C创建本机Mac OS X应用程序,但我需要连接到专有数据源,为此,数据源的所有者仅提供Java库。因此,我需要以某种方式将该Java库导入我的项目中,并在其Java类上调用函数(或者在该库周围创建Java包装器,然后从Objective- C调用我的包装器)。 现在,我该怎么做?快速的Google搜索将我引向JNI,但是我没有找到任何好的和

  • 问题内容: 我正在开发Python / ObjC应用程序,需要从ObjC的Python类中调用一些方法。我已经尝试了几种方法,但都没有成功。 如何从Objective-C调用Python方法? 我的Python类正在Interface Builder中实例化。如何从该实例调用方法? 问题答案: 使用PyObjC。 它包含在Leopard及更高版本中。 它甚至可以与iPython一起使用: ` 要从

  • Objective-C Runtime Runtime 是什么? Runtime 是 Objective-C 区别于 C 语言这样的静态语言的一个非常重要的特性。对于 C 语言,函数的调用会在编译期就已经决定好,在编译完成后直接顺序执行。但是 OC 是一门动态语言,函数调用变成了消息发送,在编译期不能知道要调用哪个函数。所以 Runtime 无非就是去解决如何在运行时期找到调用方法这样的问题。 对

  • Posing,顾名思义,意思是“冒充”,它跟类似,但本质上不一样,Posing存在的目的在于子类可以冒充父类,使得后续的代码无需把父类修改为子类,就可以很方便的让父类表现成子类的行为,从而实现非常方便的冒充,这在一般的语言中是难以想象的。 在开始在Objective-C中进行构建之前,提醒读者注意,在Mac OS X 10.5中声明已经弃用了冒充(Posing),并且之后无法使用它。 因此对于那些

  • Objective-C类定义了一个将数据与相关行为相结合的对象。 有时,仅表示单个任务或行为单元而不是方法集合是有意义的。 块是C,Objective-C和C++等编程语言中的高级功能,它允许创建不同的代码段,这些代码段可以传递给方法或函数,就像它们是值一样。 块是Objective-C对象,因此它们可以添加到或等集合中。 它们还能够从封闭范围中捕获值,使其类似于其他编程语言中的闭包或。 简单块声