Atlwinverapi. h(712): ошибка C3861: 'lcmapstringex': идентификатор не найден
я конвертирую проект vs 2008 в vs2017.
пожалуйста, помогите мне, как решить эту ошибку.
Что я уже пробовал:
я попытался изменить winver 0x0400 и _win32_winnt 0x0400 на 0x601.
Jochen Arndt
Где вы их определили?
Они должны быть определены перед включением любого заголовочного файла Windows. Что находится на вершине файл stdafx.ч с предварительно скомпилированные заголовки. В противном случае поверх каждого файла, включающего заголовочные файлы Windows, или в качестве опции глобального компилятора в настройках проекта.
Если ошибка все еще существует, то в некоторых ваших файлах может быть повторное определение.
Тем не менее, вы должны были видеть ошибку с VS 2008 тоже с отсутствующими или неправильными определениями.
Как вы преобразуете проект?
Вы использовали папку проекта VS 2008 или полную копию?
Если да, удалите все выходные и промежуточные файлы или выполните полную перестройку.
Naveen_vemuri
Я создаю проект с использованием MsBuild. Я открыл проект vs2008 в vs2017, и он внес необходимые изменения, чтобы преобразовать его в vcxproj. Я не знаю, что было написано в исходных файлах. Я переписываю командный файл и устанавливаю необходимую среду для его создания без visual studio. В этом проекте почти 20-30 файлов cpp и очень много файлов заголовков. есть один файл stdafx.h, но в нем нет файла windows.h. Я внес изменения в упомянутый выше файл (atlwinverapi. h) как будто я нахожу объявление "LCMapStringEx" в файле WinNls.h, я просто скопировал и вставил в этот файл, и ошибка устранена. но после того, как я получил другую ошибку, файл afxwin.h не найден, и я дал пути к библиотеке atl . тогда снова появляется эта ошибка «идентификатор не найден». я не понимаю, что делать, чтобы устранить эту ошибку.
Jochen Arndt
Если есть файл stdafx.h, то он, вероятно, используется.
Заголовочный файл windows. h включается другими файлами из этого заголовочного файла.
При добавлении определений они должны находиться поверх файла stdafx.h.
Как уже упоминалось ниже Ричардом, значения по умолчанию выбираются VS, когда определения отсутствуют. Тогда не должно быть никаких проблем при обновлении до более новой версии VS и более новых версий SDK.
"Я переписываю пакетный файл и устанавливаю необходимую среду для его сборки без visual studio."
Сначала попробуйте перестроиться из среды IDE VS 2017. Что будет перезаписывать старые файлы вывода и обеспечивает использование выбранного сервиса.
Как только это создаст цель без ошибок, вы можете попробовать использовать свой пакетный файл и MSBuild.
Naveen_vemuri
я добавил определения поверх файла stdafx.h.но ошибка не устранена.в чем смысл этой ошибки?почему ошибка возникает в headerfile, предоставляемом файлом библиотеки microsoft atl?
Jochen Arndt
Функция определена в он.H, который входит в Windows.сек.
Определение защищено для минимальной целевой версии windows (Vista).
Этот охранник использует одно из ваших определений или NTDDI_VERSION (которое создается из другого определения в sdkddkver.h).
Таким образом, вы должны проверить, какое определение активно, когда winnls.h входит в комплект. Вы также можете следовать за деревом включаемых файлов, включив расширенный вывод компилятора для отображения каждого обработанного файла. Чем вы можете отступить от ошибки, чтобы проверить все файлы, отличные от MS, если где-то есть странная настройка.
Но только вы можете это сделать, потому что для этого требуется иметь полный проект. У меня нет VS 2017, установленного здесь на работе (только дома), так что я даже не могу проверить файлы SDK VS 2017.
Naveen_vemuri
я попытался удалить эти определения и построить их с помощью VS IDE2017,но все равно получаю эту ошибку.
Jochen Arndt
Определения могут быть там, если они находятся поверх stdafx.h перед включением любого другого файла. Если они есть, они используются (и не вредят, если они верны).
Затем вы можете включить sdkddkver.h., который проверит определения и соответственно определит NTDDI_VERSION.
Затем следует включить общие заголовочные файлы MFC / ATL.
Если ошибка все еще возникает, то проблема, вероятно, находится где-то в ваших исходных файлах. Но только у вас есть эти файлы, и поэтому вы можете их проверить.
Как уже упоминалось, у меня здесь нет VS 2017. Таким образом, вы можете взглянуть на объявление функции в winnls.h проверить, как он охраняется (WINVER, NTDDI_VERSION или _WIN32_WINNT). Вы также можете проверить, есть ли другой охранник, использующий другое определение. Убедитесь, что условия выполнены так, чтобы функция была объявлена.
Richard MacCutchan
Вы должны удалить оба этих определения и позволить компилятору найти значение по умолчанию, определенное в sdkddkver.h, которое должно выбрать последнее. Также убедитесь, что настройки вашего проекта были обновлены до последней версии SDK (Project ->Settings->General).