Я пытаюсь использовать библиотеку 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.
Наконец проблема была решена.
Давайте проверим символы, сравнивая полученный объектный файл и символы, содержащиеся в библиотеке 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 ++ решило проблему.
Других решений пока нет …