Компиляция ImageMagick как 64-битная под OS X?

Я пытаюсь установить моддимы в OS X (см. предыдущий вопрос), модуль Apache с зависимость от ImageMagick.

Насколько я могу судить, OS X Apache скомпилирован как 64-битный. Моя предыдущая попытка запустить скомпилированный модуль moddims дала следующую ошибку:

httpd: Syntax error on line 117 of /private/etc/apache2/httpd.conf: 
Cannot load /usr/libexec/apache2/libmod_dims.so into server: 
dlopen(/usr/libexec/apache2/libmod_dims.so, 10): no suitable image found.  
Did find:\n\t/usr/libexec/apache2/libmod_dims.so: mach-o, but wrong architecture

Я предполагаю, что это означает, что мне нужно скомпилировать моддимы как 64-битные... поэтому я попробовал следующее:

moddims-read-only simon$ ./configure CFLAGS='-arch x86_64' \
    APXSLDFLAGS='-arch x86_64' --with-curl=/usr/local/bin/ \
    --with-imagemagick=/opt/ImageMagick-6.3.9/

Но это дало мне эту ошибку:

checking for MagickWandGenesis in -lMagickWand... no
checking for MagickWandGenesis in -lWand... no
configure: error: ImageMagick not found.

Раньше при компиляции без 64-битного кода CFLAGS все работало нормально.

Итак... Я предполагаю, что это означает, что мне нужно скомпилировать ImageMagick как 64-битный. Я пробовал следующее:

ImageMagick-6.3.9 simon$ ./configure --prefix=/opt/ImageMagick-6.3.9/ \
    --exec-prefix=/opt/ImageMagick-6.3.9/ CFLAGS='-arch x86_64' \
    APXSLDFLAGS='-arch x86_64'

Эта команда ./configure работает нормально, но когда я запускаю make, она какое-то время счастливо катится, а затем умирает с этой ошибкой:

/bin/sh ./libtool --silent --tag=CC   --mode=link gcc  -arch x86_64 -Wall -W -D_THREAD_SAFE -module -avoid-version -L/usr/X11/lib -R/usr/X11/lib -L/opt/local/lib -lfreetype -lz -o ltdl/dlopen.la  ltdl/loaders/dlopen.lo  
/bin/sh ./libtool --silent --tag=CC   --mode=link gcc  -arch x86_64 -Wall -W -D_THREAD_SAFE -no-undefined -dlpreopen ltdl/dlopen.la  -L/usr/X11/lib -R/usr/X11/lib -L/opt/local/lib -lfreetype -lz -o ltdl/libltdlc.la  ltdl/loaders/ltdl_libltdlc_la-preopen.lo ltdl/ltdl_libltdlc_la-lt__alloc.lo ltdl/ltdl_libltdlc_la-lt_dlloader.lo ltdl/ltdl_libltdlc_la-lt_error.lo ltdl/ltdl_libltdlc_la-ltdl.lo ltdl/ltdl_libltdlc_la-slist.lo ltdl/argz.lo 
ranlib: archive member: ltdl/.libs/libltdlc.a(argz.o) cputype (7) does not match previous archive members cputype (16777223) (all members must match)
ranlib: archive member: ltdl/.libs/libltdlc.a(argz.o) cputype (7) does not match previous archive members cputype (16777223) (all members must match)
make[1]: *** [ltdl/libltdlc.la] Error 1
make: *** [all] Error 2

Я уже не в себе, но теперь я полностью застрял! Любые идеи?


person Simon Willison    schedule 26.07.2009    source источник
comment
Путаница, вызванная голосованием «принадлежит superuser.com», вызывает беспокойство — что, черт возьми, еще принадлежит StackOverflow? Это было намного проще, когда можно было искать только в одном месте.   -  person Jonathan Leffler    schedule 27.07.2009


Ответы (2)


Мой общий трюк для обеспечения компиляции 64-битных (или 32-битных, с соответствующими изменениями):

CC="gcc -m64" ...other environment...  ./configure  ...configure arguments...

Это рассматривает компилятор C (добавьте CXX="g++ -m64", если вам нужен еще и C++) как 64-битный компилятор на основании аргумента '-m64'. Это может быть или не быть элегантным - это то, что я использую как в Solaris, так и в MacOS X. Также могут быть специфичные для пакета параметры для сценария ./configure, которые управляют этим (иногда переопределяют это); используйте './configure --help', чтобы увидеть, так ли это.

Проблема заключается в том, что libtool была настроена как 32-битная система. Прежде чем переходить на 64-битную сборку, убедитесь, что вы запустили 'make distclean', чтобы избавиться от всего мусора, или вообще удалите каталог сборки и повторно извлеките материал из tar-шара. Запустите процесс настройки, как показано на рисунке — шансов, что этого будет достаточно, достаточно.

person Jonathan Leffler    schedule 26.07.2009

Вам нужно добавить LDFLAGS="-arch x86_64" CXXFLAGS="-arch x86_64" к вашим вызовам ./configure, и он должен нормально скомпилироваться.

Тем не менее, я думаю, что вы получите наполовину работающую установку ImageMagick, если вы также не убедитесь, что libjpeg и libpng также скомпилированы с 64-битной версией.

Вы можете попробовать запустить httpd, используя двоичный файл i386 (32-битный), вместо этого добавив /usr/bin/arch -i386 к /System/Library/LaunchDaemons/org.apache.httpd.plist. Или вы можете использовать lipo для преобразования /usr/sbin/httpd в двоичный файл только для i386.

person Community    schedule 30.07.2009