Библиотека Poco 1.4.6 Xcode 5 build для симулятора iPhone
Я использовал библиотеку Poco 1.4.5-all, и недавно я обновил свой Xcode до 5.0.1. Почему-то у меня возникли проблемы со связыванием библиотек Poco для сборки устройства iPhone, поэтому мне удалось правильно связать устройство iPhone с помощью последней библиотеки Poco (poco-1.4.6p2-all)
Поскольку Xcode5.0.0 не имеет поддержки llvm для командной строки, мне пришлось собрать библиотеку Poco для устройства iPhone, как это. (изменено CXXFLAGS в файле 'build/config/iPhone-clang-libC++' для связи с библиотекой openssl)
./configure --config=iPhone-clang-libc++ -static --no-tests --no-samples --omit=Data/ODBC,Data/MySQL
make IPHONE_SDK_VERSION_MIN=5.0 POCO_TARGET_OSARCH=arm64 -s -j4
make IPHONE_SDK_VERSION_MIN=5.0 POCO_TARGET_OSARCH=armv7 -s -j4
make IPHONE_SDK_VERSION_MIN=5.0 POCO_TARGET_OSARCH=armv6 -s -j4
Так что он работал нормально при сборке для устройства iPhone.
Проблема в сборке для симулятора iPhone. Существует так много ошибок "Неопределенные символы для архитектуры i386".
Это то, что я сделал для создания библиотеки Poco для iPhoneSimulator.
Я выпустил следующую команду.
./configure --config=iPhoneSimulator-clang-libc++ -static --no-tests --no-samples --omit=Data/ODBC,Data/MySQL
make
И результат оказался проблематичным. (Существует так много ошибок "Неопределенные символы для архитектуры i386".)
Я проверил разницу между этими двумя библиотеками. Результаты инструмента "nm" выглядят следующим образом.
i686 (проблемный)
00000050 T __ZN4Poco12DigestEngine11digestToHexERKNSt3__16vectorIhNS1_9allocatorIhEEEE
000001e8 S __ZN4Poco12DigestEngine11digestToHexERKNSt3__16vectorIhNS1_9allocatorIhEEEE.eh
00000198 s __ZZN4Poco12DigestEngine11digestToHexERKNSt3__16vectorIhNS1_9allocatorIhEEEEE6digits
armv7 (ок)
0000001c T __ZN4Poco12DigestEngine11digestToHexERKSt6vectorIhSaIhEE
00000280 S __ZN4Poco12DigestEngine11digestToHexERKSt6vectorIhSaIhEE.eh
00000228 s __ZZN4Poco12DigestEngine11digestToHexERKSt6vectorIhSaIhEEE6digits
может ли это быть ключом к решению этой проблемы?
Кому-нибудь удалось построить iPhoneSimulator?
Заранее спасибо. Брюс.
2 ответа
Так что для людей, работающих под управлением OSX10.8 + XCode5, решение Mavericks на самом деле не работает. Я нашел альтернативное решение.
Другой вариант - использовать компилятор clang. Я еще не проверял это, пожалуйста, будьте осторожны. Это, кажется, компилировать.. кроме этого не уверен
в каталоге poco откройте build/config/iPhone и замените CC и CXX следующим:
CC = $(shell xcrun -find -sdk iphoneos clang)
CXX = $(shell xcrun -find -sdk iphoneos clang++)
Я наткнулся на это решение здесь
Мне удалось построить как для устройства iPhone и iPhoneSimulator.
Eventhough Xcode5.0.1 не поддерживает llvm для командной строки, вы можете скачать "Инструменты CommandLine для Maverick". Если вы установите его, то можете использовать llvm. Таким образом, вы можете использовать конфигурации сборки для "iPhone" и "iPhoneSimulator" (не нужно использовать конфигурацию "iPhone-clang-libC++" и "iPhone-clang-libC++")
И инструмент "nm" правильно показывал проблему. Что-то не так, когда я строил для iPhoneSimulator.
Итак, я покажу вам быстрое решение для тех.
1) перейдите в ваш загруженный каталог 'poco-1.4.6p2-all'
2) открыть файл build/config/iPhone
vim build/config/iPhone
3) и измените следующие две строки
CC = $(shell ls $(TOOL_PREFIX)/llvm-gcc-$(GCC_VER)* | tail -1)
CXX = $(shell ls $(TOOL_PREFIX)/llvm-g++-$(GCC_VER)* | tail -1)
к этому
CC = /usr/bin/llvm-gcc
CXX = /usr/bin/llvm-g++
Это потому, что оригинальный скрипт пытается вызвать 'llvm-gxx' в неправильном месте. "Инструменты CommandLine для Maverick" создадут символическую ссылку для "llvm-gxx" в каталоге "/usr/bin".
Извините за не красивый сценарий, но зашитый.
4) и найдите "CXXFLAGS", и укажите каталог "openssl" include & lib следующим образом. (Конечно, вам нужно построить его заранее.)
CXXFLAGS = $(OSFLAGS) -Wall -Wno-sign-compare -L(Your openssl source directory)/lib/iOS -I(Your openssl source directory)/include
5) Теперь вы закончили с этим файлом конфигурации. Сохраните его и закройте.
6) Далее откройте файл build/config/iPhoneSimulator
vim build/config/iPhoneSimulator
7) Найдите "OSFLAGS" и закомментируйте это так
# OSFLAGS = -arch $(POCO_TARGET_OSARCH) -isysroot $(IPHONE_SDK_BASE) -miphoneos-version-min=$(IPHONE_SDK_VERSION_MIN)
8) Готово. сохраните это и закройте это.
9) Теперь запустите следующие команды для создания библиотек для устройства "iPhone".
./configure --config=iPhone -static --no-tests --no-samples --omit=Data/ODBC,Data/MySQL
make IPHONE_SDK_VERSION_MIN=5.0 POCO_TARGET_OSARCH=armv7 -s -j4
если вам нужно собрать библиотеки для другой архитектуры, пожалуйста, добавьте ее.
10) Готово. Теперь выполните следующие команды для создания библиотек для iPhoneSimulator.
make clean
./configure --config=iPhoneSimulator -static --no-tests --no-samples --omit=Data/ODBC,Data/MySQL
make IPHONE_SDK_VERSION_MIN=5.0 POCO_TARGET_OSARCH=i686 -s -j4
Последняя строка выше и измененная сборка конфигурационных файлов - это решение моей проблемы... Я не очень хорошо разбираюсь в материалах компилятора и компоновщика, поэтому я не уверен, в чем на самом деле проблема с оригинальными скриптами..
11) Готово. Наконец, сравните содержимое библиотеки этих 2 как это.
nm lib/iPhoneOS/armv7/libPocoFoundation.a | grep digestToHex
nm lib/iPhoneSimulator/i686/libPocoFoundation.a | grep digestToHex
вы должны увидеть подписи скомпилированной функции C++ 'digestToHex', например, такие же, как это..
brucewang@Bruce-ui-MacBook ~/Downloads/poco-1.4.6p2-all $ nm lib/iPhoneOS/armv7/libPocoFoundation.a | grep digestToHex [ruby-1.9.3-p125]
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/nm: no name list
0000001c T __ZN4Poco12DigestEngine11digestToHexERKSt6vectorIhSaIhEE
00000280 S __ZN4Poco12DigestEngine11digestToHexERKSt6vectorIhSaIhEE.eh
00000228 s __ZZN4Poco12DigestEngine11digestToHexERKSt6vectorIhSaIhEEE6digits
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/nm: no name list
brucewang@Bruce-ui-MacBook ~/Downloads/poco-1.4.6p2-all $ nm lib/iPhoneSimulator/i686/libPocoFoundation.a | grep digestToHex [ruby-1.9.3-p125]
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/nm: no name list
00000050 T __ZN4Poco12DigestEngine11digestToHexERKSt6vectorIhSaIhEE
00000268 S __ZN4Poco12DigestEngine11digestToHexERKSt6vectorIhSaIhEE.eh
00000218 s __ZZN4Poco12DigestEngine11digestToHexERKSt6vectorIhSaIhEEE6digits
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/nm: no name list
brucewang@Bruce-ui-MacBook ~/Downloads/poco-1.4.6p2-all $
12) Если вам нужна "толстая библиотека", вызовите команду "lipo" со своего терминала. Например, вы можете сделать простой сценарий оболочки, запускающий следующую команду несколько раз для всех файлов *.a.
lipo -create -output "${UNIVERSAL_DIR}/${FILE1}" "${SIMULATOR_DIR}/${FILE1}" "${ARMV7_DIR}/${FILE1}"
Это все.