Tinyxml - ошибки ссылок при ориентации на платформу x64

Я использую библиотеку tinyxml для анализа файлов XML в моем проекте. Когда я пытаюсь настроить таргетинг на платформы x64, я получаю ошибки LINKER, и вот одна из них:

Ошибка 4, ошибка LNK2001: неразрешенный внешний символ "private: static struct TiXmlString :: Rep TiXmlString :: nullrep_" (? Nullrep_ @ TiXmlString @@ 0URep @ 1 @ A) ClassThatUsesTinyXML.obj

Обновление: я решил, что версия tinyxml для x64 не была установлена, но когда я попытался собрать библиотеку для платформ x64, я получил эту ошибку:

LNK1561: entry point must be defined

person Kira    schedule 28.03.2013    source источник
comment
Пожалуйста, опубликуйте все ошибки. Готов поспорить, где-то вверху есть ошибка, говорящая, что не может найти правильную библиотеку. Вы установили 64-битную библиотеку?   -  person Some programmer dude    schedule 28.03.2013
comment
Нет, не знал ^^ '. Я просто пытался собрать tinyxml для платформ x64, но не смог. Вот ошибка, которую я получил при сборке tinyxml: Error 1 error LNK1561: entry point must be defined path\tinyxml_2_6_2\tinyxml\LINK   -  person Kira    schedule 28.03.2013
comment
@JoachimPileborg, пожалуйста, проверьте мое обновление   -  person Kira    schedule 29.03.2013
comment
Что именно вы компилируете? DLL или xmltest? И как ?   -  person Synxis    schedule 01.04.2013
comment
Я пытался создать xmltest и целевые платформы x64. Я решил проблему, добавив в свой проект все файлы .h и .cpp, связанные с tinyxml, и теперь он работает, спасибо @Synxis :)   -  person Kira    schedule 01.04.2013
comment
Не похоже, что в TinyXML реализованы директивы экспорта dll, специфичные для Windows (фактически, MSVC). В то время как Unix-подобные системы обычно автоматически экспортируют символы из динамических библиотек, Windows требует делать это явно с помощью директив __declspec(dllexport). См. Ответ на вопрос stackoverflow.com/questions/7651671/, чтобы начать вникать в это. NB: если проблема действительно в экспорте символов DLL, TinyXML не должен собираться Visual C ++ даже для 32-битных платформ.   -  person Dmitry    schedule 05.04.2013
comment
* Я имел в виду, собираемый как разделяемая библиотека, просто для пояснения.   -  person Dmitry    schedule 06.04.2013


Ответы (3)


Вместо того, чтобы создавать tinyxml для x64 platforms и затем добавлять tinyxml.h и tinystr.h в проект, я просто добавил все файлы библиотеки, включая файлы .cpp, и теперь я могу ориентироваться на платформы x64, библиотека, по сути, создается, когда я создаю весь проект .

person Kira    schedule 03.04.2013
comment
На самом деле здесь не используется разделяемая библиотека tinyxml - это просто уродливая форма статической связи. Обратите внимание, что вам нужно будет перекомпилировать приложение, если вы хотите использовать новую версию tinyxml (но так ли часто она меняется?) - person j_kubik; 05.04.2013

Не похоже, что tinyxml «из коробки» поддерживает сборки разделяемых библиотек.

Вот шаги, которые я выполнил для создания библиотеки DLL из источников tinyxml 2.6.2:

  1. Откройте предоставленный файл SLN, tinyxml.sln, в MS Visual Studio Express 2012 для рабочего стола Windows. При появлении запроса выберите преобразование старых файлов проекта в новый формат.
  2. В «Платформах решений» выберите «Configuration Manager ...»
  3. В «Активная платформа решения:» выберите «‹ Создать ... ›»
  4. В поле «Тип или выберите новую платформу:» выберите «x64», если он еще не выбран. Обязательно скопируйте настройки из конфигурации "Win32". Щелкните ОК. Нажмите «Закрыть», чтобы выйти из Configuration Manager.
  5. Щелкните правой кнопкой мыши проект tinyxml в обозревателе решений. Выберите «Свойства».
  6. Для «Конфигурация:» выберите «Все конфигурации». Аналогичным образом для «Платформа:» выберите «Все платформы».
  7. На странице «Свойства конфигурации» → «Общие» измените «Тип конфигурации» на «Динамическая библиотека (.dll)». Измените «Целевое расширение» на «.dll». Нажмите кнопку ОК, чтобы закрыть диалоговое окно "Страницы свойств tinyxml".
  8. Выберите конфигурацию «Выпуск» и платформу «x64».
  9. Снова щелкните правой кнопкой мыши проект tinyxml в обозревателе решений и выберите «Перестроить».

Внутри tinyxml_2_6_2\tinyxml\x64\Release вы найдете tinyxml.dll, но без библиотеки импорта (tinyxml.lib). Это потому, что символы не экспортируются. См. Как мне создать библиотеку импорта (.lib) И DLL в Visual C ++?

Если вы хотите пойти по пути общей библиотеки, вам нужно будет экспортировать нужные символы с помощью специфичного для MSVC модификатора __declspec(dllexport). См. Видимость символов в Windows.

person Daniel Trebbien    schedule 07.04.2013

Ошибка возникает, когда вы определяете TIXML_USE_STL для компиляции библиотеки, но не для источников, которые связаны с библиотекой. Конечным результатом является то, что библиотека компилируется с кодом, отличным от исходного кода, использующего библиотеку.

person Patrick    schedule 06.10.2014