2016-11-07 1 views
1

Я пытаюсь построить gnu iconv на OSX как статическую библиотеку. Это не проблема, она строит штраф сКак создать статическую библиотеку iconv на OSX без имен символов libiconv?

./configure --enable-static 
make clean && make 

, но когда я бегу нм на libiconv.a, я получаю следующие результаты

... 
_libiconv 
_libiconv_open_ 
_libiconv_close_ 
... 

Это проблематично, потому что я хочу, чтобы построить libxml2 с помощью эта библиотека, и это требует следующих символов

iconv 
iconv_open 
iconv_close 

Просматривая файл заголовка, похоже, разница между этими двумя именами символа определяется ли LIBICONV_PLUG. Но когда я бегу сделать как

make clean && make CPPFLAGS=-DLIBICONV_PLUG 

я получаю ошибки, потому что некоторые вещи, которые не определены, такие как ICONV_GET_DISCARD_ILSEQ и ICONV_SET_HOOKS. Еще раз просмотрев файл заголовка, они определяются только в том случае, если LIBICONV_PLUG не определен.

Мой вопрос: правильно ли я использую LIBICONV_PLUG? Есть ли другой способ получить статическую библиотеку с необходимыми символами? Должен ли я проходить через неопределенные символы и определять их самостоятельно?

ответ

2

Существует три возможных способа создания и использования GNU libiconv. Во всех трех случаях символы, которые он определяет для использования программой C или C++ (через файл заголовка), это «iconv_open», «iconv», «iconv_close».

  • Нормальным является то, что, на уровне объектного файла, он определяет символы «libiconv_open» и т.д., чтобы не вступать в конфликт со стандартными библиотеками операционной системы. Отображение между символом на уровне C и уровнем объектного файла происходит в <iconv.h>.

    Вы получите сообщение об ошибке, если вы используете системный <iconv.h> с GNU libiconv. {So, dylib, a} или наоборот. Это особенность, потому что у двух есть несколько разные функции (OS X libiconv.dylib поддерживает кодировку под названием «UTF-8-MAC», тогда как GNU libiconv имеет ряд улучшений и исправлений), а несоответствие может привести к проблемам.

  • Если вы являетесь системным вендором, вы можете создать GNU libiconv таким образом, чтобы он определял «iconv_open» вместо «libiconv_open» и т. Д. Это достигается с помощью простого редактирования iconv.h.

    Или, в частности, на OS X вы можете выбрать libiconv от https://opensource.apple.com/ и скомпилировать его для себя. Но имейте в виду, что эта версия основана на GNU libiconv 1.11, то есть она довольно старая.

  • Как поясняется в README GNU libiconv, флаг LIBICONV_PLUG создает библиотеку, которая переопределит функциональные возможности системы; это работает только на GNU, Solaris и OSF/1.

В вашем случае, когда вы только хотите иметь GNU libiconv быть использованы некоторыми свободного программного пакета (например, как libxml2), самый простой способ это сделать первый подход, и при компиляции этого пакета, использование -I и -L, чтобы найти файл заголовка GNU libiconv и библиотеку.

В самом деле, libxml2 делает это легко: его настроить скрипт уже имеет опцию --with-Iconv = префикса, с помощью которого вы определяете иерархию каталогов, в которых вы установили GNU libiconv (файл заголовок в приставке/include/и файл объекта в префикс/lib /); скрипт configure затем синтезирует соответствующие опции -I и -L.

+0

Благодарим вас за этот информативный и исчерпывающий ответ! – Sossisos

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