gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 01:47:35 24 4
gpt4 key购买 nike

我尝试使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com