Сборка статических библиотек Graphviz для iOS - PullRequest
7 голосов
/ 29 августа 2011

Я пытаюсь собрать статические библиотеки для Graphviz, чтобы включить их в приложение для iOS, но не могу заставить его работать. Вот что я сделал до сих пор, используя graphviz 2.28.0], Xcode 4.1, OSX 10.7, и я нацеливаюсь на симулятор iOS.

Я нашел Инструкции по настройке Глена Лоу , и с некоторой информированной догадкой обновил их до:

./configure --build=i486-apple-darwin --host=arm-apple-darwin9 --disable-dependency-tracking --enable-shared=no --enable-static=yes --enable-ltdl-install=no --enable-ltdl=no --enable-swig=no --enable-tcl=no --with-codegens=no --with-fontconfig=no --with-freetype2=no --with-ipsepcola=yes --with-libgd=no --with-quartz=yes --with-visio=yes --with-x=no --with-cgraph=no CC="/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc-4.2" CPP="/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc-4.2 -E" CXX="/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/g++-4.2" CXXCPP="/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/g++-4.2 -E" OBJC="/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc-4.2" LD="/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/ld" CPPFLAGS="-arch armv6 -isysroot /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.3.sdk -miphoneos-version-min=4.0" CXXCPPFLAGS="-arch armv6 -isysroot /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.3.sdk -miphoneos-version-min=4.0"

Это работает, но потом "make" работает некоторое время и выдает ошибки:

Making all in gvpr
  CCLD   mkdefs
ld: warning: ignoring file mkdefs.o, file was built for armv6 which is not the architecture being linked (i386)
ld: warning: ignoring file /usr/local/lib/libSystem.dylib, missing required architecture i386 in file
ld: warning: symbol dyld_stub_binder not found, normally in libSystem.dylib
Undefined symbols for architecture i386:
  "_exit", referenced from:
      start in crt1.10.6.o
  "_main", referenced from:
      start in crt1.10.6.o
ld: symbol(s) not found for architecture i386
collect2: ld returned 1 exit status
make[3]: *** [mkdefs] Error 1
make[2]: *** [all-recursive] Error 1
make[1]: *** [all-recursive] Error 1
make: *** [all] Error 2

Я не совсем понимаю все спецификации архитектуры, поэтому любая помощь, чтобы заставить это работать, приветствуется.

Ответы [ 3 ]

2 голосов
/ 02 мая 2012

Я получил это работает.Сценарий сборки завершается неудачно в конце, когда он пытается создать исполняемый файл, так как он скомпилирован для i386 вместо x86 или x86_64, но все библиотеки собираются просто отлично.

# For iPhoneOS
export DEV_iOS=/Developer/Platforms/iPhoneOS.platform/Developer
export SDK_iOS=${DEV_iOS}/SDKs/iPhoneOS5.0.sdk
export COMPILER_iOS=${DEV_iOS}/usr/bin
export CC=${COMPILER_iOS}/gcc
export CXX=${COMPILER_iOS}/g++
export LDFLAGS="-arch armv7 -pipe -Os -gdwarf-2 -no-cpp-precomp -mthumb -isysroot ${SDK_iOS}"
export CFLAGS=${LDFLAGS}
export CXXFLAGS=${LDFLAGS}
export LD=${COMPILER_iOS}/ld
export CPP=${COMPILER_iOS}/llvm-cpp-4.2
export AR=${COMPILER_iOS}/ar
export AS=${COMPILER_iOS}/as
export NM=${COMPILER_iOS}/nm
export CXXCPP=${COMPILER_iOS}/llvm-cpp-4.2
export RANLIB=${COMPILER_iOS}/ranlib

./configure --host=arm-apple-darwin11 --disable-dependency-tracking --enable-shared=no --enable-static=yes --enable-ltdl-install=no --enable-ltdl=no --enable-swig=no --enable-tcl=no --with-codegens=no --with-fontconfig=no --with-freetype2=no --with-ipsepcola=yes --with-libgd=no --with-quartz=yes --with-visio=yes --with-x=no --with-cgraph=no
1 голос
/ 06 января 2012

Проблема в том, что mkdefs выполняется во время самого процесса сборки после его создания. Так что, если вы собираете для armv6 или armv7, файл не может быть выполнен в командной строке Mac OS X. Мой обходной путь - создать mkdefs для архитектуры i386 (которая необходима и для симулятора iPhone) и скопировать его в lib Каталог / gvpr после получения этой ошибки. Убедитесь, что файл не может быть перезаписан, и перезапустите сборку.

0 голосов
/ 25 сентября 2011

Похоже, что компоновщик пытается установить связь с системными библиотеками, установленными на вашем Mac. Все эти библиотеки будут скомпилированы для i386 или x86_64, которые не будут работать при компиляции библиотек для iPhone. Вам потребуется перенастроить компоновщик для связи с библиотеками, входящими в iPhone SDK.

Следует также отметить, что вам, вероятно, придется скомпилировать библиотеку дважды - один раз как armv6, а затем как armv7. iPhone 3G и некоторые старые iPod Touches используют архитектуру armv6, в то время как более новые iPhone используют архитектуру armv7. После того как вы скомпилировали библиотеки для обеих архитектур, вы можете использовать lipo (для получения дополнительной информации наберите «man lipo» в вашем терминале), чтобы создать единую статическую библиотеку с обеими архитектурами. Если вы собираетесь разрабатывать свое приложение с использованием симулятора iPhone / iPad, то я также предлагаю один раз скомпилировать его как i386, чтобы вы могли использовать свою библиотеку с симулятором. И снова, lipo может создать единую статическую библиотеку со всеми тремя архитектурами.

Теперь веб-сайт GraphViz в данный момент недоступен, поэтому я не могу загрузить библиотеку и запустить скрипт настройки, как вы, но я подозреваю, что перед запуском «make» вы должны внести следующие изменения в файл make это производится сценарием настройки. В зависимости от того, на какую версию iOS SDK вы нацеливаетесь и какую версию gcc вы используете на своем компьютере, вам может потребоваться настроить некоторые из приведенных ниже изменений, чтобы они соответствовали вашей среде. Ниже приведены инструкции по сборке для armv6. Вам нужно будет изменить настройки для сборки armv7, когда вы будете готовы заняться этой архитектурой.

Найдите CC = cc и измените его на: CC = /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc-4.2

Найдите -arch i386 в CFLAG и измените его на: -арх армв6

Найдите CFLAG и добавьте в НАЧАЛО !! -isysroot /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.0.sdk

Найдите SHARED_LDFLAGS = -arch i386 -dynamiclib и измените его на: SHARED_LDFLAGS = -arch armv6 -dynamiclib

...