2014-01-24 1 views
0

Я использую libxml2 в своем приложении и динамически связываю его. Он отлично работает, пока я не начал замечать, что динамическая библиотека была обновлена ​​на 10.9 OSX, и когда приложение работает на 10.8 и 10.7, я вижу проблемы из-за более низкой версии libxml2. Проблема видели это Внимание: программа составлена ​​на Libxml 209 с использованием старше 207 я, кажется, чтобы получить разбора ошибок с этим, однако тот же код прекрасно работает в 10.9 с версии 209libxml2.a проблемы с привязкой к OSX 10.9

Чтобы избежать этой проблемы, я хотел статически компилируйте мой код, чтобы использовать libxml2.a. Я столкнулся с несколькими проблемами. Я не смог скомпилировать из-за отсутствия символов в версии libxml2.a, установленной на моей машине.

Загрузите последний код из git repo и скомпилировали его. Я не установил его, но сделал мою программу ссылкой на новую статическую библиотеку. Тем не менее у меня такая же проблема.

Compile Flags 
Ld /devel/Build/Products/Debug/SecurityCoreUpdater normal x86_64 
    cd /devel/BPSUpdater 
    setenv MACOSX_DEPLOYMENT_TARGET 10.7 
    /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -arch x86_64 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk -L/devel/Build/Products/Debug -F/devel/Build/Products/Debug -filelist /devel/Build/Intermediates/BPSUpdater.build/Debug/BPSUpdater.build/Objects-normal/x86_64/SecurityCoreUpdater.LinkFileList -mmacosx-version-min=10.7 /devel/libxml2.a -lCF_LSXClient 

Undefined symbols for architecture x86_64: 
    "_libiconv", referenced from: 
     _xmlIconvWrapper in libxml2.a(encoding.o) 
    "_libiconv_close", referenced from: 
     _xmlFindCharEncodingHandler in libxml2.a(encoding.o) 
     _xmlCharEncCloseFunc in libxml2.a(encoding.o) 
    "_libiconv_open", referenced from: 
     _xmlFindCharEncodingHandler in libxml2.a(encoding.o) 
ld: symbol(s) not found for architecture x86_64 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

Есть ли исправление для этого? Я довольно смущен, как решить эту проблему. Мне бы очень хотелось изменить библиотеку парсеров именно для этого. Это означает, что мне нужно переписать много кода. Пожалуйста помоги.

С уважением, Варуна

ответ

0

Я нашел ответ, что есть необходимость добавить libiconv.a если соединение статически в других флагов компоновщика в параметрах сборки или добавить libiconv.dylib в «Link Binary с библиотеками» в " Build Phase "в xcode5. Аналогичным образом я также заметил необходимость включения liblzma в качестве динамического lib или static для решения проблемы.

Большая часть рассмотрения импорта при добавлении в качестве динамической библиотеки (dylib) - это порядок, в котором присутствуют библиотеки. По-видимому, libiconv и liblzma должны быть ниже libxml2.a для правильной компиляции. Я не уверен, почему это необходимо, но я смог решить проблему, используя ту же процедуру. Тем не менее, я статически собрал все три библиотеки, поскольку я не хотел запускать эти изменения динамической версии lib между ОС, так как мой установщик не проверяет установленную версию библиотек.

+0

Это не работает для меня. Я собрал libxml2, liblzma и libiconv статически и добавил их в свой проект, но независимо от того, в каком порядке я ссылаюсь, я всегда получаю ошибки компоновщика, упомянутые в исходном вопросе. –

+0

Я не уверен, как это выглядит в вашем xcode, но убедитесь, что у вас нет ничего динамически связанного. Затем добавьте следующее в «Другие флаги компоновщика» /opt/local/lib/libxml2.a /opt/local/lib/libiconv.a /opt/local/lib/liblzma.a /opt/local/lib/libcrypto.a /opt/local/lib/libz.a. Возможно, вам не нужен /opt/local/lib/libcrypto.a, но просто экспериментируйте со следующей конфигурацией. Убедитесь, что вы используете только библиотеки, установленные портом, как показано здесь. Библиотеки, которые по умолчанию являются частью SDK, являются только динамической библиотекой. – user2085689

+0

Еще один важный урок, который я узнал, НИКОГДА не использует libxml напрямую, даже если он включен в SDK. Лучше использовать обертки NSXML, чтобы гарантировать, что он не сломается. – user2085689

Смежные вопросы