2

Xcode 5.0 Objective-C Project の 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) in 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 バーのアーキテクチャが x86_64 であることを確認しました。また、ブーストも内蔵OK。私は、この 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 に答える