проблема mingw / libxml2 - PullRequest
       23

проблема mingw / libxml2

2 голосов
/ 13 февраля 2011

Я пытаюсь использовать libxml2 (v2.2.6.0) с mingw под win7. Я добавил lib -llibmlx2, но каждый раз, когда я компилирую, я получаю:

error: undefined reference to `_imp__xmlFree'

В Google я нашел это: http://osdir.com/ml/gnome.lib.xml.ge.../msg00003.html
Но все равно не работает.

Есть идеи?

спасибо ...

Ответы [ 4 ]

4 голосов
/ 02 января 2015

Это можно исправить, используя для настройки флаг "--disable-shared", например ::

. / Configure --prefix = / mingw --disable-shared

2 голосов
/ 06 апреля 2018

Попробуйте добавить -DIN_LIBXML к вашим флагам компиляции (из связанной проблемы ).

1 голос
/ 25 февраля 2014

Я считаю, что эта проблема возникает только при использовании предварительно скомпилированных двоичных файлов libxml2, подготовленных Игорем Златовичем.Я подозреваю, что проблема исчезнет, ​​если использовать libxml2 lib, изначально скомпилированную с mingw.

Вот объявление xmlFree в libxml / globals.h:

#else /* !LIBXML_THREAD_ALLOC_ENABLED */
XMLPUBVAR xmlMallocFunc xmlMalloc;
XMLPUBVAR xmlMallocFunc xmlMallocAtomic;
XMLPUBVAR xmlReallocFunc xmlRealloc;
XMLPUBVAR xmlFreeFunc xmlFree;
XMLPUBVAR xmlStrdupFunc xmlMemStrdup;
#endif /* LIBXML_THREAD_ALLOC_ENABLED */

и XMLPUBVAR расширяется на

#define XMLPUBVAR __declspec(dllimport) extern

из libxml / xmlexports.h

Первое наблюдение.xmlFree - это не функция, а переменная.Это исключительный случай, так как почти все другие функции libxml2 являются реальными экспортируемыми функциями.Это объясняет, почему xmlFree () является единственной проблемной функцией, с которой сталкиваются люди.

компилятор mingw меняет имя импортированного символа с xmlFree на _imp__xmlFree, которого нет в libxml2.lib.Я предполагаю, что с другими компиляторами, такими как MSVC, компоновщик вместо этого ищет правильный символ _xmlFree, найденный внутри libxml2.lib:

C:\MinGW\msys\1.0\home\100517891\embedded\ext\libxml2\lib>"c:\Program Files\Microsoft Visual Studio 9.0\VC\bin\dumpbin.exe" /exports libxml2.lib | grep xmlFree
              _xmlFree
              _xmlFreeAttributeTable
              _xmlFreeAutomata
              _xmlFreeCatalog
              _xmlFreeDoc
              _xmlFreeDocElementContent
              _xmlFreeDtd
              _xmlFreeElementContent
              _xmlFreeElementTable
              _xmlFreeEntitiesTable
              _xmlFreeEnumeration
              _xmlFreeIDTable
              _xmlFreeInputStream
              _xmlFreeMutex
              _xmlFreeNode
              _xmlFreeNodeList
              _xmlFreeNotationTable
              _xmlFreeNs
              _xmlFreeNsList
              _xmlFreeParserCtxt
              _xmlFreeParserInputBuffer
              _xmlFreePattern
              _xmlFreePatternList
              _xmlFreeProp
              _xmlFreePropList
              _xmlFreeRMutex
              _xmlFreeRefTable
              _xmlFreeStreamCtxt
              _xmlFreeTextReader
              _xmlFreeTextWriter
              _xmlFreeURI
              _xmlFreeValidCtxt

Я не нашел способа исправить ошибку компоновки, но простойи безопасный способ обойти проблему - это признать тот факт, что xmlFree - это простая переменная-указатель функции, инициализированная по адресу стандартной функции free () в globals.c, и единственный способ изменить это назначение - перекомпилировать dll с некоторымипереключатели отладки.

Не стесняйтесь заменять вызовы xmlFree () на вызовы free ().Все должно быть хорошо, и ошибка связи исчезнет.

1 голос
/ 06 марта 2012

Вы, наверное, давно это исправили, но на всякий случай попробуйте это с -lxml2. То есть отбросьте префикс lib из имени библиотеки. Вам также может понадобиться использовать опцию -L, чтобы задать путь поиска. Укажите -L перед -l в командной строке.

...