Связывание библиотеки C ++ (libtorrent) из Objective-C

Я пытаюсь использовать библиотеку libtorrent из Xcode 5.0 Objective-C Project безуспешно.

Я собрал boost 1.54 и libtorrent-rasterbar (последний) из источников, использующих LLVM 5.0, с этим проблем нет. Кроме того, через MacPorts я получил pkg-config, чтобы получить правильные флаги для библиотеки libtorrent-rasterbar. Исходя из моих настроек сборки, вывод для 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 «Flags Linker» и «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]);

Компоновщик не может найти символы, вывод:

Неопределенные символы для архитектуры 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&без знака int) в
createpackage.o
«Libtorrent :: подробнее :: add_files_impl (Libtorrent :: file_storage&,
станд :: __ 1 :: basic_string,
std :: __ 1 :: allocator> const&, std :: __ 1 :: basic_string, std :: __ 1 :: allocator> const&,
boost :: function, std :: __ 1 :: allocator>)>, без знака
int) «, по ссылке от:
Libtorrent :: add_files (Libtorrent :: file_storage&, std :: __ 1 :: basic_string,
std :: __ 1 :: allocator> const&без знака 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&без знака int) в
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&без знака int) в
createpackage.o ld: символ (ы) не найден для архитектуры x86_64
clang: error: команда компоновщика завершилась неудачно с кодом выхода 1 (используйте -v, чтобы увидеть
призывание)

Я довольно озадачен. Проверено, что архитектура libtorrent-raster bar имеет вид x86_64. Кроме того, буст построен хорошо. Я новичок в этом подходе к смешиванию кода 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.

2

Решение

Наконец проблема была решена.

Давайте проверим символы, сравнивая полученный объектный файл и символы, содержащиеся в библиотеке 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

Разница, которую многие могут себе представить, увидев этот результат, заключается в том, что я использую стандартную библиотеку C ++ LLVM для моих файлов .mm, в то время как libtorrent был скомпилирован с GCC Stdlib, поэтому разные символы ссылаются на char_traits, basic_string и т. Д.

Итак, изменение в настройках сборки XCode> Стандартная библиотека C ++ на libstdc ++ решило проблему.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]