Пространство имен уже определено как целевое пространство имен для другого файла в хранилище

Обновлено: 03.07.2024

Это может быть плохо из-за того, что я сделал, так как я новичок в c ++, но вот код, который я написал внутри моего Example.cpp:

Итак, я пришел к мысли вызвать это пространство имен внутри Main.cpp:

Теперь у меня есть проблема, чтобы вызвать «пример» пространства имен из другого файла. Нужно ли создавать заголовок для этого файла cpp?

Решение

Как только ваш пример пространства имен объявлен и реализован, вы можете использовать его следующим образом:

Объяснение об исходных файлах и заголовочных файлах.

Зачем ? Чтобы позволить компилятору узнать об этих именах. Здесь, чтобы сделать исполняемый файл, есть два шага:

Шаг 1: скомпилировать каждый исходный файл в соответствующий объектный файл, т.е. example.o файл из вашего example.cpp файл. example.o файл будет содержать байт-код (здесь код вашего example::myfunc1 а также example::myfunc2 функции) и main.o код для main функция.

Эти объектные файлы создаются компилятором. Например, вы создаете объектный файл с GCC (G ++ для C ++) следующим образом: g++ -c -o example.o example.cpp ,

  • За example.cpp , если бы вы не включили свой заголовочный файл, GCC прочитал бы void example::myfunc1() < . >и вы бы выбросили ошибку, сообщив вам что-то вроде Unknown namespace в зависимости от компилятора, который вы используете.
  • За main.cpp , вы получили бы еще одну ошибку, сообщающую, что пространство имен не найдено.

Что интересно, так это то, что в компиляции main.o байт код примерно говорит call myfunc1 from the example namespace, then call myfunc2 from the example namespace но это НЕ включите код для этих 2 функций в main.o файл.

Поэтому, когда GCC читает вызовы функций, он не знает об их реализации, но знает их из заголовочного файла. Грубо говоря, объявление их в заголовочном файле и включение его в исходные файлы говорит GCC что-то вроде This namespace and its functions exist, they will be implemented somewhere else ,

Итак, у вас есть 2 соответствующих объектных файла: main.o а также example.o ,

Шаг 2: возьмите все объектные файлы, которые вы только что создали, чтобы связать их и создать исполняемый файл. Опять же, с GCC: gcc -o exampleExcutable main.o example.o , Вот где происходит магия: компоновщик видит, что есть вызов example::myfunc1 а также example::myfunc2 находит свою реализацию в example.o и может создать ваш исполняемый файл.

Здесь вы получите свой исполняемый файл exampleExecutable , вы запускаете его и получаете ожидаемый результат:

Для подтверждения, заголовочные файлы используются для объявления символов и включения в исходные файлы. Когда исходные файлы компилируются, соответствующие объектные файлы не содержат определения этих объявленных символов, но они разрешаются во время ссылки.

Другие решения

Чтобы компилятор / компоновщик знал, к какой функции вы обращаетесь, ему нужен прототип функций.

Эта статья помогает устранить проблему, которая вызывает ошибку, когда центральный магазин содержит файлы .admx из Windows 10.

Применяется к: Windows 10 — все выпуски, Windows Server 2012 R2, Windows Server 2016, Windows Server 2019
Исходный номер КБ: 3077013

Симптомы

Рассмотрим следующие сценарии.

  • У вас есть контроллер домена, который работает Windows Server.
  • Создается центральный хранилище файлов административных шаблонов групповой политики (.admx files) на компьютере. Дополнительные сведения см. в дополнительных сведениях о создании файлов административного шаблона центра хранения групповой политики в Windows Vista.
  • Вы присоединяется Windows 10 на основе компьютера к домену.
  • На Windows 10 компьютере копируете файлы в каталоге %systemroot%\PolicyDefinitions, вдав их в центральный магазин ADMX и переопределяйте все существующие файлы *.admx и *.adml. Затем откройте консоль управления групповой политикой (GPMC) для редактирования политики.
  • Вы щелкните узел Политики в конфигурации компьютера или конфигурации пользователя.
  • У вас есть компьютер, на Windows 10 RTM (сборка 10240).
  • Вы обновляете компьютер до более поздних сборки Windows 10.

Местообладатель <.root> представляет доменное имя.

пример

Вы можете не заметить эту проблему, если вы обновляете Windows 7 или Windows 8.1 до Windows 10 версии 1511 (Windows 10 RTM).

Причина

Эта проблема возникает из-за того, что файл LocationProviderADM.admx был переименован в Microsoft-Windows-Geolocation-WLPAdm.admx в Windows 10 RTM.

После копирования файлов .admx с Windows 10 в центральный магазин, содержащий файл LocationProviderADM.ADMX, который находится в более ранней версии Windows, существует два файла .admx, которые содержат те же параметры, но имеют разные имена. Это вызывает ошибку "пространство имен уже определено".

При обновлении с Windows 10 RTM до Windows 10 версии 1511 новый файл LocationProviderAdm.admx копируется в папку, сохраняя при этом старый файл Microsoft-Windows-Geolocation-WLPAdm.admx. Таким образом, существует два файла ADMX, которые адресуют одно и то же пространство имен политик.

Обходной путь

Удалите файлы LocationProviderADM.admx и LocationProviderADM.adml и измените microsoft-Windows-Geolocation-WLPAdm.admx и Microsoft-Windows-Geolocation-WLPAdm.adml на правильные имена.

  1. Удалите файлы LocationProviderADM.admx и LocationProviderADM.adml из центрального магазина.
  2. Переименование Microsoft-Windows-Geolocation-WLPAdm.admx в LocationProviderADM.admx.
  3. Переименование Microsoft-Windows-Geolocation-WLPAdm.adml в LocationProviderADM.adml.
  • Удалите файл Microsoft-Windows-Geolocation-WLPAdm.admx из локального магазина. Путь к локальному хранилище политик — C:\Windows\PolicyDefinitions.

Файлы DMX и ADML защищены системой. Чтобы переименовать или удалить эти файлы, необходимо добавить разрешения NTFS в файлы. Для этого используйте следующие команды:

Откройте повышенную командную подсказку, а затем takeown.exe для предоставления права собственности местным администраторам:

takeown /F " C:\Windows\PolicyDefinitions\Microsoft-Windows-Geolocation-WLPAdm.admx" /A

takeown /F " C:\Windows\PolicyDefinitions\en-US\Microsoft-Windows-Geolocation-WLPAdm.adml" /A

Предоставление администраторам разрешений на полный контроль для обоих файлов.

Переименуй оба файла с расширением .old, и вы больше не будете получать всплывающие двери Geolocation при открываемом GPEDIT. MSC.

Дополнительная информация

Существует Windows 10 только одна линия отличий между содержимым предварительного файла LocationProviderADM.admx и Windows 10 Microsoft-Windows-Geolocation-WLPAdm.admx.

В предварительном Windows 10 LocationProviderADM.admx строка выглядит <supportedOn> следующим образом:

В Windows 10 LocationProviderADM.admx строка выглядит <supportedOn> следующим образом:

Эта ошибка возникает при нажатии узла Политики в конфигурации компьютера или конфигурации пользователя.


Групповая политика

Пространство имен ‘Microsoft.Policies.Sensors.WindowsLocationProvider’ уже определено как целевое пространство имен для другого файла в хранилище.

Нажав на ОК, окно исчезло, и я смог продолжить работу над редактором групповой политики.

Пространство имен уже определено


Это происходит потому, что файл LocationProviderADM.admx был переименован в Microsoft-Windows-Geolocation-WLPAdm.admx в Windows 10.

Так что вполне возможно, что вы столкнулись с этой ошибкой на некоторых системах после обновления до Windows 10 RTM. Но вы не заметите этого, если вы обновились до Windows 10 v1511 с Windows 8.1 или Windows 7.

Microsoft объясняет, что эта ошибка предназначена только для информационных целей, а нажатие на кнопку «ОК» и движение вперед приведут к нормальной работе GPEDIT.

Однако, если вы хотите устранить причину этого, KB3077013 предлагает удалить файлы LocationProviderADM.admx и LocationProviderADM.adml и изменить имена Microsoft-Windows-Geolocation-WLPAdm.admx и Microsoft-Windows-Geolocation- WLPAdm.adml файлы с правильными именами.

Для этого сначала создайте точку восстановления системы. Затем откройте окно командной строки с повышенными правами и выполните следующую команду:


Затем предоставьте администраторам Полный доступ разрешения для обоих файлов. Для этого откройте C: \ Windows \ PolicyDefinitions и щелкните правой кнопкой мыши файл Microsoft-Windows-Geolocation-WLPAdm.admx и выберите Свойства.

На вкладке «Безопасность» нажмите кнопку Изменить . Далее в новом окне настроек выберите Полный доступ , как показано ниже. Нажмите Применить, OK и выйдите.

Пространство имен'Microsoft.Policies.Sensors.Sensors.WindowsLocationProvider 'уже определено как целевое пространство имен для другого файла в памяти

Нажав OK, я потерял поле и смог продолжить работу над редактором групповой политики.

Вопрос в том, что это за ошибка и почему она возникает?

Пространство имен уже определено

Только записи, принадлежащие администратору, могут выполнять шорткод include me

Это связано с тем, что файл LocationProviderADM.admx в Windows 10 был переименован в Microsoft-Windows-Geolocation-WLPAdm.admx.

Итак, после обновления до Windows 10 RTM вы можете столкнуться с этой ошибкой в ​​некоторых системах. Однако вы не заметите этого, если обновились напрямую с Windows 8.1 или Windows 7 до Windows 10 v1511.

Microsoft объясняет, что эта ошибка носит исключительно информационный характер, и если вы нажмете ОК и двинетесь вперед, функция GPEDIT будет работать нормально.

Однако если вы хотите устранить причину, KB3077013 предлагает удалить файлы LocationProviderADM.admx и LocationProviderADM.adml и изменить имена файлов Microsoft-Windows-Geolocation-WLPAdm.admx и Microsoft-Windows-Geolocation-WLPAdm.admx и Microsoft -Windows-Geolocation-WLPAdm.adml с правильными именами.

Сначала создайте точку восстановления системы. Затем откройте расширенное окно командной строки pt и выполните следующую команду:

Затем предоставьте администраторам Полный доступ разрешения для обоих файлов. Откройте C: WindowsPolicyDefinitions и щелкните правой кнопкой мыши файл Microsoft-Windows-Geolocation-WLPAdm.admx. и выберите «Свойства».

На вкладке «Безопасность» нажмите кнопку «Изменить». , Затем выберите Полный контроль в новом поле настройки как показано ниже. Нажмите Apply, OK и завершите процесс.

Сделайте то же самое для файла C: WindowsPolicyDefinitionsen-USMicrosoft-Windows-геолокации-WLPAdm.adml.

в заключение переименовать оба файла с расширением .old.

Перезагрузите компьютер и проверьте.

Только записи, принадлежащие администратору, могут выполнять шорткод include me

Читайте также: