Статическое связывание ICU в Windows

#c #windows #linker #icu

#c #Windows #компоновщик #icu

Вопрос:

Я пытаюсь использовать ICU Unicode в моем проекте C .

Я загрузил библиотеки из здесь, а затем связал их с помощью:

  1. Добавление каталога lib64 в Свойства -> Компоновщик -> Общие -> Дополнительные каталоги библиотеки
  2. Добавление имен всех .файлы библиотеки на вкладке ввода.

Затем я #включаю «ucnv.h», а также сборку и запуск.

Программа работает нормально, но я получаю это сообщение об ошибке, в котором говорится, что мне нужно поместить DLL рядом с exe.

Я делаю это, и он работает нормально. Мои вопросы

Как мне статически связать ICU с моим проектом?

Что я пробовал

Я попытался загрузить мастер с github и открыть файл allinone.sln, а затем установить следующее:

  1. Выпуск и x64
  2. Изменение вывода из DLL в статическую библиотеку
  3. Добавление 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 до первого использования экспорта библиотеки. Это дает вам достаточно времени для подготовки среды выполнения вашего приложения.