Как скомпилировать библиотеку на Mac OS X, чтобы она поддерживала плоское пространство имен?
У меня проблема с libxml2. Когда я пытаюсь сделать update_dyld_shared_cache
, это говорит:
update_dyld_shared_cache failed: flat namespace not supported in /usr/lib/libxml2.2.dylib
Я скомпилировал libxml2 следующим образом:
./configure --prefix=/usr --disable-dependency-tracking
make CFLAGS='-arch i386 -arch x86_64 -arch ppc -arch ppc64' LDFLAGS='-flat_namespace'
Где я был не прав?
Обновить:
Кажется, что Лики действительно использовал флаг flat-nampespace:
/bin/sh ./libtool --tag=CC --mode=link gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64 -version-info 9:2:7 -flat_namespace -o libxml2.la -rpath /usr/lib SAX.lo entities.lo encoding.lo error.lo parserInternals.lo parser.lo tree.lo hash.lo list.lo xmlIO.lo xmlmemory.lo uri.lo valid.lo xlink.lo HTMLparser.lo HTMLtree.lo debugXML.lo xpath.lo xpointer.lo xinclude.lo nanohttp.lo nanoftp.lo DOCBparser.lo catalog.lo globals.lo threads.lo c14n.lo xmlstring.lo xmlregexp.lo xmlschemas.lo xmlschemastypes.lo xmlunicode.lo xmlreader.lo relaxng.lo dict.lo SAX2.lo xmlwriter.lo legacy.lo chvalid.lo pattern.lo xmlsave.lo xmlmodule.lo schematron.lo -lpthread -lz -liconv -lm
gcc -dynamiclib ${wl}-flat_namespace ${wl}-undefined ${wl}suppress -o .libs/libxml2.2.dylib .libs/SAX.o .libs/entities.o .libs/encoding.o .libs/error.o .libs/parserInternals.o .libs/parser.o .libs/tree.o .libs/hash.o .libs/list.o .libs/xmlIO.o .libs/xmlmemory.o .libs/uri.o .libs/valid.o .libs/xlink.o .libs/HTMLparser.o .libs/HTMLtree.o .libs/debugXML.o .libs/xpath.o .libs/xpointer.o .libs/xinclude.o .libs/nanohttp.o .libs/nanoftp.o .libs/DOCBparser.o .libs/catalog.o .libs/globals.o .libs/threads.o .libs/c14n.o .libs/xmlstring.o .libs/xmlregexp.o .libs/xmlschemas.o .libs/xmlschemastypes.o .libs/xmlunicode.o .libs/xmlreader.o .libs/relaxng.o .libs/dict.o .libs/SAX2.o .libs/xmlwriter.o .libs/legacy.o .libs/chvalid.o .libs/pattern.o .libs/xmlsave.o .libs/xmlmodule.o .libs/schematron.o -lpthread -lz /usr/lib/libiconv.dylib -lm -arch i386 -arch x86_64 -arch ppc -arch ppc64 -install_name /usr/lib/libxml2.2.dylib -compatibility_version 10 -current_version 10.2
(cd .libs && rm -f libxml2.dylib && ln -s libxml2.2.dylib libxml2.dylib)
(cd .libs && rm -f libxml2.2.7.2.dylib && ln -s libxml2.2.dylib libxml2.2.7.2.dylib)
ar cru .libs/libxml2.a SAX.o entities.o encoding.o error.o parserInternals.o parser.o tree.o hash.o list.o xmlIO.o xmlmemory.o uri.o valid.o xlink.o HTMLparser.o HTMLtree.o debugXML.o xpath.o xpointer.o xinclude.o nanohttp.o nanoftp.o DOCBparser.o catalog.o globals.o threads.o c14n.o xmlstring.o xmlregexp.o xmlschemas.o xmlschemastypes.o xmlunicode.o xmlreader.o relaxng.o dict.o SAX2.o xmlwriter.o legacy.o chvalid.o pattern.o xmlsave.o xmlmodule.o schematron.o
ranlib .libs/libxml2.a
Обновить:
otools показывает:
$ otool -hV /usr/lib/libxml2.2.dylib
/usr/lib/libxml2.2.dylib:
Mach header
magic cputype cpusubtype caps filetype ncmds sizeofcmds flags
MH_MAGIC I386 ALL 0x00 DYLIB 12 1348 DYLDLINK NO_REEXPORTED_DYLIBS
$ otool -L /usr/lib/libxml2.2.dylib
/usr/lib/libxml2.2.dylib:
/usr/lib/libxml2.2.dylib (compatibility version 10.0.0, current version 10.2.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 111.1.7)
/usr/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.3)
/usr/lib/libiconv.2.dylib (compatibility version 7.0.0, current version 7.0.0)
/usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
Обновить:
Я пытался сделать универсальную библиотеку с lipo
Но, похоже, что-то сломалось. После того, как я скопировал универсальную библиотеку в /usr/lib
, update_dyld_shared_cache
сказал это:
update_dyld_shared_cache failed: in /System/Library/Frameworks/Foundation.framework/Versions/C/Foundation can't find dylib /usr/lib/libxml2.2.dylib