2016-05-19 5 views
-1

Я делаю текстовую игру, используя ICU для обработки игрового текста из файлов JSON с кодировкой UTF-8 на трех основных платформах ПК. Я могу скомпилировать и связать бинарный файл с CMake, ссылаясь на типы ICU, такие как UChar, UnicodeString и т. Д., И все работает правильно. Как ни странно, есть определенные заголовки, из которых я не могу получить доступ к каким-либо типам или функциям, не вызывая ошибки компоновщика «Неопределенные символы». В частности, заголовок «ustdio.h», из которого мне нужно получить доступ к файлам u_fopen(), u_fclose(), u_fgets() и т. Д., Для извлечения строк юникода из моих файлов JSON.Функции ICU ustdio.h: Неопределенные символы в Mac OS при построении с CMake

неопределенные символы для архитектуры x86_64: "_u_fclose_57", ссылочные от: FileReader :: Закрыть() в libsource.a (FileReader.cpp.o) "_u_fgets_57", ссылочные от: FileReader :: HasNextLine() в libsource.a (FileReader.cpp.o) FileReader :: NextLine() в libsource.a (FileReader.cpp.o) "_u_fopen_57", на который ссылаются: FileReader :: FileReader (std :: __ 1 :: basic_string, std :: __ 1 :: allocator>) в libsource.a (FileReader.cpp.o)

Я использую this CMake module file, чтобы найти файлы .h и .dylib. Из вывода CMake я знаю, что он связывается с /usr/local/lib/libicuuc.dylib, но, глядя в эту папку, я также вижу множество других связанных с ICU dylib. Другой программист поручил мне проверить, действительно ли символы, которые я ищу, в dylib, используя nm, и я вижу в списке символов, что они не являются. Могу ли я предположить, что эти символы определены в одном из других файлов dylib? Если они есть, и я нахожу правильный dylib, как мне изменить FindICU.cmake, чтобы связать его с дополнительной динамической библиотекой? Модуль кажется мне очень тупым, и я не знаю, где бы я его изменил, чтобы исправить это.

ответ

0

Я понял это путем поиска в таблице символов каждого файла dylib, связанного с ICU, до тех пор, пока не найду недостающие символы (которые определены в libicuio.57.1.dylib). Это помогло мне понять, что символы действительно не найдены FindICU.cmake. Затем мне удалось проанализировать достаточно файла, чтобы определить проблему: есть переменная ICU_FIND_COMPONENTS, которая должна быть настроена на список желаемых компонентов, чтобы файл модуля связывался с другими dylib. Эта переменная не была документирована нигде, что довольно сложно. Но я решил эту ошибку компоновщика, добавив следующую строку в FindICU.cmake перед строкой 121:

set(${ICU_PUBLIC_VAR_NS}_FIND_COMPONENTS io) 

Кроме того, вы можете проверить, является ли нужный компонент быть связан путем вывода значений переменных ICU_<component>_FOUND. В моем случае ICU_IO_FOUND возвращал false, потому что модуль не ищет io dylib, если явно не сказано об этом. Именно это и помогло мне изменить FindICU.cmake, чтобы связать дополнительный файл dylib, откуда приходит символ.

+0

Вместо этого используйте 'find_package (ICU COMPONENTS uc io REQUIRED)'. – julp

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

  • Нет связанных вопросов^_^