Пространство имен уже определено как целевое пространство имен для другого файла в хранилище
Это может быть плохо из-за того, что я сделал, так как я новичок в 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 на правильные имена.
- Удалите файлы LocationProviderADM.admx и LocationProviderADM.adml из центрального магазина.
- Переименование Microsoft-Windows-Geolocation-WLPAdm.admx в LocationProviderADM.admx.
- Переименование 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
Читайте также: