Exiv2 для iOS: поддержка инструментария XMP не скомпилирована в

Я создаю приложение для iOS, которое берет изображение, модифицирует изображение и встраивает метаданные XMP в изображение. Проблема заключается в написании части XMP. После сохранения изображения в формате JPEG я снова открываю изображение с помощью Exiv2, записываю XMP и повторно сохраняю JPEG. Вот мой пример кода:

Exiv2::Image::AutoPtr image = Exiv2::ImageFactory::open(jpegUrl);
image->readMetadata();
Exiv2::XmpData &xmpData = image->xmpData();
if (xmpData.empty()) {
    cout<<"file XMP empty."<<endl;
}
else{
    cout<<"file XMP not empty."<<endl;
}

xmpData["Xmp.GPano.mycustomtag"] = "customString";

image->setXmpData(xmpData);
image->writeMetadata(); //Never crashes until here.

std::string xmpPacket;
if (0 != Exiv2::XmpParser::encode(xmpPacket, xmpData)) //Here is the problem!
{
    throw Exiv2::Error(1, "Failed to serialize XMP data");
    return;
}

точка остановки

На моем ПК это работает хорошо, и с использованием XCode и симулятора iOS это также работает хорошо. XMP правильно записан в файл JPEG. Однако, когда я тестировал на iPhone, он бросает

Предупреждение: поддержка инструментария XMP не скомпилирована.

и XMP там нет. Я подозреваю, что Exiv2 не связывался должным образом, когда я создавал его для iOS. Вот как я это сделал:

  1. Загрузите и соберите Expat для всех арок (i386 x86_64 armv7 armv7s arm64). Я использовал этот скрипт для сборки, и после небольшой корректировки он работал нормально. Я проверил сгенерированный libexpat.a с липо, и все арки там. Обратите внимание, что Expat требуется Exiv2, если XMP включен.
  2. Постройте Exiv2 для iPhoneSimulator (i368 и x86_64), используя этот скрипт с некоторыми корректировками. При сборке ошибок не было и как я уже сказал, все работало нормально. Команда configure выглядит следующим образом: ./configure --host=x86_64-apple-darwin --prefix=$PREFIXDIR/iphonesim-build --disable-dependency-tracking --enable-static=yes --enable-shared=no --disable-dependency-tracking --enable-commercial --disable-nls --disable-lensdata --without-libiconv-prefix --without-zlib --with-expat=/Users/kevin/Downloads/expat-ios
  3. Однако при сборке для iPhoneOS (armv7, armv7s и arm64) были ошибки:

libtool: link: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++ -arch armv7 -arch armv7s -arch arm64 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.2.sdk -mios-version-min=10.2 -o ../bin/exiv2 exiv2.o actions.o utils.o -Wl,-bind_at_load -L/Users/kevin/Downloads/expat-ios/lib -L/Users/kevin/Downloads/exiv2-ios/src/exiv2-0.25/xmpsdk/src ./.libs/libexiv2.a -liconv -lexpat -ldl Undefined symbols for architecture armv7: "_WXMPIterator_DecrementRefCount_1", referenced from: TXMPIterator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >::operator=(TXMPIterator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > const&) in libexiv2.a(xmp.o) TXMPIterator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >::~TXMPIterator() in libexiv2.a(xmp.o) TXMPIterator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >::~TXMPIterator() in libexiv2.a(xmp.o) TXMPIterator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >::~TXMPIterator() in libexiv2.a(xmp.o) Exiv2::XmpParser::decode(Exiv2::XmpData&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) in libexiv2.a(xmp.o)

и после длинного списка ошибок:

"MD5Init(MD5_CTX*)", referenced from: Exiv2::Converter::computeExifDigest(bool) in libexiv2.a(convert.o) Exiv2::Converter::computeIptcDigest() in libexiv2.a(convert.o) "MD5Final(unsigned char*, MD5_CTX*)", referenced from: Exiv2::Converter::computeExifDigest(bool) in libexiv2.a(convert.o) Exiv2::Converter::computeIptcDigest() in libexiv2.a(convert.o) "MD5Update(MD5_CTX*, unsigned char const*, unsigned int)", referenced from: Exiv2::Converter::computeExifDigest(bool) in libexiv2.a(convert.o) Exiv2::Converter::computeIptcDigest() in libexiv2.a(convert.o) ld: symbol(s) not found for architecture armv7 clang: error: linker command failed with exit code 1 (use -v to see invocation) make[1]: *** [exiv2] Error 1 make: *** [install] Error 2

Таким образом, несмотря на то, что компилятор компилируется и библиотека для iPhoneOS создается, Exiv2 не может вызвать XmpParser::encode правильно и вылетает. Если я удаляю эту часть, она не падает, но XMP не записывается.

Мои вопросы:

  1. Как сделать Exiv2 правильно построенным для арок iPhoneOS?
  2. Есть ли другие возможные причины, которые делают запись XMP в файл JPEG в iOS не работающей?

0 ответов

Другие вопросы по тегам