Что значит не иметь vsnprintf, _vsnprintf - PullRequest
0 голосов
/ 09 апреля 2020

И должен ли я иметь одинаковую настройку во всех config.h файлах в проекте?

Симптом: nmake при попытке построить части проекта в MSV C выдает «Командная строка» inconsistent dll linkage vsnprintf. Поиск в этом сообщении говорит, что обычно это связано с тем, что макросы не работают последовательно. Я создаю пакет, который предположительно работает; Я не изменил дистрибутив.

Эти две процедуры Microsoft задокументированы здесь . В config.h файлах * есть флаги

/* Define to 1 if you have the `vsnprintf' function. */
/* #undef HAVE_VSNPRINTF */
...
/* Define to 1 if you have the `_vsnprintf' function. */
#define HAVE__VSNPRINTF 1

Некоторые, но не все config.h файлы генерируются из config.h.in / configure.ac при установке пакета. Кажется, у меня есть разные настройки для HAVE_VSNPRINTF в разных config.h s в разных поддеревьях проекта. Я не хочу отменять дистрибутив, но это не так (?)

vsnprintf в MSVCRnnn.DLL, где nnn - выпуск MSV C; Я установил v12.0 / Обновление 5 сообщества. Почему такая старая версия? ...

Справочная информация

Я пытаюсь построить древнюю версию компилятора Haskell Hugs, сентябрь 2006 г. В основном это написано для Unix среды в C / C ++. Но я опираюсь на Windows 8.1, процессор на базе x64. Следующие инструкции: здесь ; и это хранилище содержит всю структуру каталогов, которую я создаю (спасибо Франклин Чен).

Ориентированная на Unix часть, которую я создал, используя MinGW / MSYS, а не Cygwin. (64-битный MinGW не go хорошо, поэтому я вернулся и использовал 32-битный.)

Теперь я пытаюсь построить деталь Windows, которая по сути является фанерой GUI поверх Unix - начиная с «Использование Microsoft Visual C ++» в инструкциях. Visual Studio был совершенно не доволен: файлы проекта .vcproj больше не поддерживаются. Я пытался devenv /Upgrade получить их как .vcxproj. Но затем возникают дальнейшие проблемы с попыткой MSBuild, которую он не может проверить по .xsd; либо Microsoft.Build.{Core|Common}.xsd дал много отказов по поводу пропущенных типов. Поэтому я отказался от этого подхода.

Поэтому я следую инструкциям «Запуск Microsoft Visual C ++ из командной строки», используя файл .bat с поддержкой MSV C для запуска командной строки. как здесь doco . nmake запущен, но выбрасывает кучу предупреждений inconsistent dll, только для vsnprintf. Я также получаю differs in parameter lists за различные процедуры; это ошибка при включении? В конце концов nmake вылетает, без сборки .exe s, я хочу.

Ответы [ 3 ]

0 голосов
/ 14 апреля 2020

Я исправил это для этого конкретного приложения. #define HAVE_VSNPRINTF 1, также #define HAVE_SNPRINTF 1 в config.h делает ошибку inconsistent dll linkage vsnprintf go. То есть я изменил эти флаги на те же, что и в configure.ac -генерированном config.h.

. В проекте много config.h в разных поддеревьях, устанавливающих эти флаги. Но есть только один файл, который читает / выполняет над ним действия: src/machdep.c «Машинно-зависимый код». Это #include d для всех приложений. По сути, это приложение написано для платформы Unix, и я ожидаю настройки для всей машины.

В ответе @MSalters я понимаю, что платформа MSV C не обязательно ожидает одинаковые настройки машина шириной. Но это приложение тесно связано со средами Unix / MSys и MSV C, поэтому я ожидаю, что им нужна согласованность.

Тогда я делаю успехи. У меня еще нет целого приложения для компиляции: оно еще дальше, поэтому у меня больше ошибок inconsistent dll linkage ... для других подпрограмм. Я вижу дальнейшие несоответствия в настройках флагов в config.h s.

0 голосов
/ 15 апреля 2020

Альтернативный ответ:

Симптом C4273: 'xxx' inconsistent dll linkage является предупреждением, а не ошибкой, поэтому компилятор продолжает работу. vsnprintf и друзья форматируют список аргументов в выходной буфер. Так что, вероятно, не имеет значения, если разные .exe s в проекте ссылаются на разные версии. В худшем случае они будут давать разные результаты в выходных данных для тех же аргументов.

Так что просто игнорируйте сообщение и не беспокойтесь о расхождениях в config.h.

Полное раскрытие: после редактирования config.h для удаления vsnprintf et c сообщений go; У меня есть некоторые остаточные несоответствия re malloc и free - несмотря на редактирование config.h для любых настроек, связанных с ALLOC. Различия в поведении allo c между различными .exe более тревожны.

0 голосов
/ 09 апреля 2020

Идея скриптов конфигурирования состоит в том, чтобы выяснить, имеет ли ваш компилятор vsnprintf. Конечно, разные сгенерированные config.h файлы дают разные результаты, вот и весь смысл. Если бы у них всех было vsprintf, не было бы необходимости проверять!

Сказав это, я бы охарактеризовал механизм configure.ac как положительно древний. Неоднократно мне было проще просто создать новый .vcxproj с нуля.

Я не уверен насчет документации MSDN, которую вы связываете. Вы ссылаетесь на документацию VC14.x, в которой отмечается, что vsnprintf изменился с версии VC12.0, которую вы утверждаете использовать.

...