#c #windows #linker #icu
#c #Windows #компоновщик #icu
Вопрос:
Я пытаюсь использовать ICU Unicode в моем проекте C .
Я загрузил библиотеки из здесь, а затем связал их с помощью:
- Добавление каталога lib64 в Свойства -> Компоновщик -> Общие -> Дополнительные каталоги библиотеки
- Добавление имен всех .файлы библиотеки на вкладке ввода.
Затем я #включаю «ucnv.h», а также сборку и запуск.
Программа работает нормально, но я получаю это сообщение об ошибке, в котором говорится, что мне нужно поместить DLL рядом с exe.
Я делаю это, и он работает нормально. Мои вопросы
Как мне статически связать ICU с моим проектом?
Что я пробовал
Я попытался загрузить мастер с github и открыть файл allinone.sln, а затем установить следующее:
- Выпуск и x64
- Изменение вывода из DLL в статическую библиотеку
- Добавление U_STATIC_IMPLEMENTATION ко всем препроцессорам проекта
Затем я перестраиваю, а затем добавляю каждый из каталогов выпуска проектов в раздел Дополнительные каталоги библиотек моих свойств проектов, а затем также добавляю имена библиотек в раздел ввода.
Теперь это действительно работает для UTF-8, однако для другой кодировки, такой как Big-5, большинство функций (и в основном все основные) возвращают значение NULL.
Кроме того, еще одна причина для статической библиотеки заключается в том, что загруженная мной DLL имеет размер более 16 МБ, что слишком велико. В документах ICU даже говорится, что они рекомендуют статическое связывание для уменьшения размера (путем удаления ненужного)
Комментарии:
1. Какую проблему вы пытаетесь решить? Статическое связывание с библиотекой вводит множество ограничений, что в конечном итоге приводит к использованию одной версии одного компилятора. Хотя теоретически эта проблема может быть решена, проблема связывания с двумя или более библиотеками с несовместимыми параметрами компилятора не может.
2. @IInspectable Я пытаюсь статически связать ICU с моим приложением, поэтому мне не нужно предоставлять другую DLL.
3. Вы можете решить эту проблему, добавив DLL в качестве пользовательского ресурса и распаковав его по мере необходимости.
/DELAYLOAD
Опция компоновщика удобно справляется с ситуацией, когда связанная во время компиляции DLL недоступна во время создания процесса.4. @IInspectable Влияет ли это на время запуска? Когда я запускаю приложение, я полагаю, что ICU немедленно ищет DLL, так как именно поэтому я получаю ошибку времени выполнения при запуске, даже если я не использую ICU в это время.
5. Динамически связанный импорт во время компиляции разрешается во время создания процесса. Импорт с задержкой загрузки разрешен во время первого использования. Я полагаю, что это также позволяет отложить запуск кода ICU до первого использования экспорта библиотеки. Это дает вам достаточно времени для подготовки среды выполнения вашего приложения.