Как исправить ошибку «неверный идентификатор» после установки переменных среды?
Я пытаюсь настроить cocos2dx в Ubuntu 14.04 LTS, но после установки переменных среды (в .bashrc) я получаю эту ошибку:
bash: export: dev/cocos2d-x-3.2/tools/cocos2d-console/bin': not a valid identifier
bash: export:/home/john/android': not a valid identifier
bash: export: dev/android-ndk-r10b': not a valid identifier
bash: export:dev/adt-bundle-linux-x86_64-20140702/sdk': not a valid identifier
И я не знаю, что делать чтобы исправить это.
задан
20 December 2018 в 00:58
поделиться
4 ответа
, но после установки переменных среды
похоже, что вы сделали это неправильно.
Полученные вами ошибки означают, что пути (например, / home / john / android ) используются как имена переменных, а не как присвоенные им значения .
- Правильный синтаксис для присвоения переменной —
] ИМЯ = значение. - Правильный синтаксис для экспорта переменной (с любым значением, если оно уже было присвоено):
ИМЯ экспорта. - Правильный синтаксис для назначения и одновременно экспортировать переменную (с присвоенным значением)
export NAME = value.
Я подозреваю, что вы пытаетесь сделать третье действие, но используете неправильный синтаксис. Пять распространенных ошибок, которые могут привести к ошибкам, подобным тому, что вы видите:
-
Использование пробелов вместо
=.значение экспорта NAMEневерно;значениезатем интерпретируется как имя следующей переменной для экспорта.(Это происходит потому, что
экспорт ИМЯ1 ИМЯ2является правильным синтаксисом для экспорта нескольких переменных.) -
Пробелы вокруг
=. Во многих языках программирования допустимо и стилистически предпочтительно дополнять операторы пробелами большую часть времени. Но присвоение значения переменной в сценарии оболочки (или в другой ситуации, когда вы вводите команды оболочки), это запрещено.NAME = значение(в командеexportили иначе) не будет работать; необходимо использоватьNAME = значение.(
export NAME = valueпытается экспортировать переменные с именемNAME,=иvalue. К счастью, это никогда не приводит к успеху в автоматическом режиме, потому что попытка экспорта переменной с именем=является синтаксической ошибкой. В отличие отexport NAME = valueбудет работать, но не присваиваетзначениедляИМЯ— вместо этого присваивает пустой, ноль-длина строки вИМЯи экспортирует ее, а также отдельно экспортирует значение переменной. Оба являются распространенными ошибками.) -
Разделение частей значения переменной пробелами. Переменные среды могут содержать пробелы, но на практике они редко используются в качестве разделителей полей в переменных среды. Когда одна переменная намеренно содержит несколько путей, обычно используется
:для их разделения. -
Отсутствие кавычек при присвоении переменных. Иногда предполагается, что значение переменной окружения содержит пробел. Например, это может быть имя каталога, действительно содержащего пробел. В этом случае необходимо заключать в кавычки любые пробелы.
Один из способов сделать это — поставить перед ними
. См. Как я могу защитить круглые скобки, переданные в команду cd? и Невозможно удалить файл для получения информации о других способах — методы, представленные в ответах, применимы, хотя ни один из вопросов не является конкретным о назначении переменных среды.Например, вот несколько способов экспортировать переменную среды
SILLYPATHсо значением/ home / ek / silly name / bin:экспорт SILLYPATH = / home / ek / silly name / binэкспорт SILLYPATH = '/ home / ek / глупое имя / bin'экспорт SILLYPATH = "/ home / ek / глупое имя / bin"Часто, когда папка, которую вы должны использовать в оболочке или назначать широко используемой переменной среды, содержит пробел, ее можно переименовать. (Но иногда это непрактично или нежелательно.)
-
Назначение и / или экспорт переменной, когда вообще ничего не нужно делать. Это своего рода мета-ошибка; конкретная техническая проблема часто является одной из вышеперечисленных, но решение состоит в том, чтобы избавиться от проблемной строки или какой-либо ее части, а не исправлять ее. Разумеется, не удаляйте код из
.bashrcбез разбора. Но экспортмог быть добавлен случайно, или может непреднамеренно содержать больше кода, чем предполагалось. Например, предположим, что вы хотели написать:echo 'export PATH = ~ / some.bin: "$ PATH"' >> ~ / .bashrc; . ~ / .bashrcЭто должно быть добавлено к
.bashrc, а затем повторно загружено. Но предположим, что вместо этого вы написали:echo 'export PATH = ~ / some.bin: "$ PATH". ~ / .bashrc '>> ~ / .bashrc # НЕПРАВИЛЬНО!Тогда ваша команда
exportне просто экспортирует увеличенное значениеPATH, но также попытается экспортировать переменные названный.и/ home / ваше-имя пользователя / .bashrc, что вам не нужно. Поскольку они содержат символы, запрещенные в именах переменных, вы будете получать сообщение об ошибке каждый раз при запуске новой интерактивной оболочки bash.Чтобы избежать этой проблемы, я предлагаю отредактировать
.bashrcв редакторе ( например,nano ~ / .bashrc,gedit ~ / .bashrc) вместо перенаправления вывода в конец с помощью>>.
Я подозреваю этой информации может быть достаточно для того, чтобы найти и исправить ошибку в вашем файле .bashrc . Если вам нужна дополнительная помощь, вы, конечно же, должны опубликовать полное содержимое этого файла для анализа. (Это только совпадение, что ваша проблема оказалась достаточно часто встречающейся и с достаточно прозрачным сообщением об ошибке, чтобы дать общий ответ, подобный этому.)
ответ дан Community
20 December 2018 в 00:58
поделиться
Убедитесь, что вы используете:
export ENV_VARIABLE
Вместо:
export $ENV_VARIABLE
В противном случае , вы пытаетесь экспортировать значение переменной, а не саму переменную, поэтому вы получите эту ошибку.
ответ дан Lambda Pi Omega
20 December 2018 в 00:58
поделиться
Удалите пробелы и знак доллара . Например, это работает точно так же, как вы можете установить модуль настроек django на веб-сервере через SSH, то есть:
export DJANGO_SETTINGS_MODULE=myapp.settings
ответ дан Patrick Mutuku
20 December 2018 в 00:58
поделиться
Я видел это довольно часто, когда вы копируете что-то с кавычками (из Интернета) и обновляете среду или файл bashrc.
Хорошим местом для начала было бы просто вручную ввести кавычки в вставленное содержание.
ответ дан Gaurav Bhatnagar
7 October 2019 в 01:04
поделиться
Другие вопросы по тегам:
Похожие вопросы:
Как исправить ошибку «неверный идентификатор» после установки переменных среды?
3 ответа
Удостоверьтесь, что Вы работаете:
export ENV_VARIABLE
, А не:
export $ENV_VARIABLE
Иначе, Вы пытаетесь экспортировать значение переменной, а не самой переменной, таким образом, Вы получите эту ошибку.
ответ дан Fonzie
07.10.2019, 01:04
Ссылка
Устраняют пробелы и знак доллара. , Например, это работает просто тот же способ, которым Вы могли установить django модуль настроек на веб-сервере через SSH т.е.:
export DJANGO_SETTINGS_MODULE=myapp.settings
Ссылка
, но после установки переменных окружения
похоже, что Вы не сделали этого правильно.
ошибки Вы становитесь средними, что пути (как /home/john/android) используются в качестве имена из переменных, а не как значения присвоенный им.
- правильный синтаксис для присвоения переменной
NAME=value. - правильный синтаксис для экспорта переменной (с любым значением, если таковые имеются, это было уже присвоено)
export NAME. - правильный синтаксис, чтобы присвоиться и экспортировать переменную (с присвоенным значением) одновременно
export NAME=value.
я подозреваю, что Вы пытаетесь сделать третью вещь, но используете неправильный синтаксис. Четыре частых ошибки, которые могли произвести ошибки как то, что Вы видите:
-
Используя пробелы вместо
=.export NAME valueявляется неправильным;valueтогда интерпретируется как название последующей переменной для экспорта.(Это происходит, потому что
export NAME1 NAME2правильный синтаксис для экспорта нескольких переменных.) -
пробелы Помещения [приблизительно 1 111]. На многих языках программирования, это и допустимо и стилистически предпочтительно для дополнения операторов пробелами большую часть времени. Но присваивать значение переменной в сценарии оболочки (или другая ситуация, где Вы даете команды оболочки), это не позволяется.
NAME = value(вexportкоманда или иначе) не будет работать; необходимо использоватьNAME=value.(
export NAME = valueпопытки экспортировать переменные, названныеNAME,=, иvalue. К счастью, это никогда, кажется, не успешно выполняется тихо, потому что попытка экспортировать переменную, названную=, является синтаксической ошибкой. На контрастеexport NAME= value, будет казаться, будет работать, но не присваиваетсяvalueк [1 122] — вместо этого, он присваивает пустую, строку нулевой длины [1 123] и экспортирует его, и отдельно экспортирует переменнуюvalue. Оба — частые ошибки.) -
Разделение частей значения переменной с пробелами. Переменные среды могут содержать пробелы, но на практике они редко используются в качестве разделителей полей в переменных среды. Когда единственная переменная намеренно содержит разнообразные пути, обычно
:используется для разделения их. -
Не заключение в кавычки располагает с интервалами при присвоении переменным. Иногда значение переменной среды, как предполагается, содержит пространство. Например, это могло бы быть название каталога, который действительно содержит пространство. В этом случае необходимо заключить любые пробелы в кавычки.
Один способ сделать это должно предшествовать им с [1 126]. См. , Как я могу защитить круглые скобки, переданные команде CD? и Неспособный удалить файл для получения информации о других путях — методики, представленные в ответах, применяются, даже при том, что никакой вопрос не конкретно о присвоении переменным среды.
, Например, вот несколько способов экспортировать переменную среды
SILLYPATHсо значением/home/ek/silly name/bin:export SILLYPATH=/home/ek/silly name/binexport SILLYPATH='/home/ek/silly name/bin'export SILLYPATH="/home/ek/silly name/bin"Часто, когда папка, которую необходимо использовать в оболочке или присвоить широко используемой переменной среды, содержит пространство, она могла бы извлечь выгоду из того, чтобы быть переименованным. (Но иногда это непрактично или нежелательно.)
я подозреваю, что это может быть достаточной информацией для Вас, чтобы найти и исправить ошибку в Вашем .bashrc файл. Если Вы нуждаетесь в дальнейшей помощи, необходимо, конечно, отправить полное содержание того файла для анализа. (Это только по совпадению, что Вашей проблемой, оказалось, была та, с которой достаточно часто встречаются, и с достаточно прозрачным сообщением об ошибке, сделала общий ответ как этот возможным.)
Ссылка
Теги
Похожие вопросы
СООБЩЕНИЯ КОМПИЛЯТОРА ОБ ОШИБКАХ
§ Если в меню Options?Linker?Link Buffer, установлен параметр Memory, переключите его в значение Disk.
§ Возможно программа слишком велика, чтобы компилироваться в таком объеме памяти. Следует разбить ее на два или более модуля.
§ несоответствующее количество begin и end (не забудьте, что оператор case также заканчивается словом end);
§ включаемый файл заканчивается в середине раздела операторов. Каждый раздел операторов должен целиком помещаться в одном файле;
§ незаконченный комментарий.
§ несовместимые типы переменной и выражения в операторе присваивания;
§ несовместимые типы фактического и формального параметров в обращении к процедуре или функции;
§ тип выражения, несовместимый с типом индекса при индексировании массива;
§ несовместимые типы операндов в выражении.
§ Идентификатору функции можно присваивать значения только внутри раздела операторов данной функции.
§ Объектный файл .obj определяет идентификаторы PUBLIC, которые не находятся в сегменте CODE.
§ Идентификатор обозначает абсолютную переменную.
§ Идентификатор обозначает процедуру или функцию типа inline.
§ Файл .com содержит ссылки с размерами в байтах на перемещаемые идентификаторы. Такая ошибка происходит в случае, если вы используете операторы HIGH и DOWN с перемещаемыми идентификаторами или если вы ссылаетесь в директивах DB на перемещаемые идентификаторы.
§ Операнд ссылается на перемещаемый идентификатор, который не был определен в сегменте CODE или в сегменте DATA.
§ Операнд ссылается на процедуру EXTRN или функцию EXTRN со смещением, например CALL SortProc+8.
§ Процедуры или функции были описаны с помощью описания forward, но их определение не найдено.
§ Вы пытаетесь осуществить приведение типа выражения, когда разрешается только ссылка на переменную, процедуру или функцию.
§ Вы пытаетесь присвоить константу вне диапазона переменной.
§ Вы пытаетесь передать константу вне диапазона в качестве параметра процедуре или функции.
Размер локальных переменных, описанных в программе или функции, не может превышать 64 Кбайт.
Что такое необъявленные ошибки идентификатора? Каковы общие причины и как их исправить?
Пример текстов ошибок:
- Для компилятора Visual Studio:
error C2065: 'cout' : undeclared identifier - Для компилятора GCC:
'cout' undeclared (first use in this function)
39
Решение
Чаще всего они приходят из-за того, что забывают включить заголовочный файл, содержащий объявление функции, например, эта программа выдаст ошибку «необъявленный идентификатор»:
Отсутствует заголовок
int main() {
std::cout << "Hello world!" << std::endl;
return 0;
}
Чтобы это исправить, мы должны включить заголовок:
#include <iostream>
int main() {
std::cout << "Hello world!" << std::endl;
return 0;
}
Если вы написали заголовок и включили его правильно, заголовок может содержать неправильный включить охрану.
Чтобы узнать больше, смотрите http://msdn.microsoft.com/en-us/library/aa229215(v=vs.60).aspx.
Переменная с ошибкой
Другой распространенный источник ошибки новичка возникает, когда вы неправильно написали переменную:
int main() {
int aComplicatedName;
AComplicatedName = 1; /* mind the uppercase A */
return 0;
}
Неправильный объем
Например, этот код выдаст ошибку, потому что вам нужно использовать std::string:
#include <string>
int main() {
std::string s1 = "Hello"; // Correct.
string s2 = "world"; // WRONG - would give error.
}
Использовать до объявления
void f() { g(); }
void g() { }
g не был объявлен до его первого использования. Чтобы это исправить, либо переместите определение g до f:
void g() { }
void f() { g(); }
Или добавить декларацию g до f:
void g(); // declaration
void f() { g(); }
void g() { } // definition
stdafx.h не сверху (специфично для VS)
Это зависит от Visual Studio. В VS нужно добавить #include "stdafx.h" перед любым кодом. Код до того, как он игнорируется компилятором, так что если у вас есть это:
#include <iostream>
#include "stdafx.h"
#include <iostream> будет проигнорировано Вам нужно переместить его ниже:
#include "stdafx.h"#include <iostream>
Не стесняйтесь редактировать этот ответ.
54
Другие решения
Рассмотрим похожую ситуацию в разговоре. Представьте, что ваш друг говорит вам: «Боб идет на ужин», а ты не представляешь, кто такой Боб. Вы будете в замешательстве, верно? Твой друг должен был сказать: «У меня есть коллега по работе по имени Боб. Боб подходит к обеду». Теперь Боб объявлен, и вы знаете, о ком говорит ваш друг.
Компилятор выдает ошибку «необъявленный идентификатор», когда вы пытаетесь использовать какой-то идентификатор (который будет именем функции, переменной, класса и т. Д.), И компилятор не видит объявления для него. То есть компилятор понятия не имеет, о чем вы говорите, потому что раньше его не видел.
Если вы получаете такую ошибку в C или C ++, это означает, что вы не сказали компилятору о том, что вы пытаетесь использовать. Объявления часто встречаются в заголовочных файлах, поэтому, скорее всего, это означает, что вы не включили соответствующий заголовок. Конечно, может случиться так, что вы просто не помните, чтобы объявить сущность вообще.
Некоторые компиляторы выдают более конкретные ошибки в зависимости от контекста. Например, пытаясь скомпилировать X x; где тип X не был объявлен с Clang скажет вам «неизвестное имя типа X«. Это гораздо полезнее, потому что вы знаете, что он пытается интерпретировать X как тип. Тем не менее, если у вас есть int x = y;, где y еще не объявлено, он скажет вам «использование необъявленного идентификатора y«потому что есть некоторая двусмысленность в том, что именно y может представлять.
12
У меня была такая же проблема с пользовательским классом, который был определен в пространстве имен. Я пытался использовать класс без пространства имен, вызывая ошибку компилятора «идентификатор» MyClass «не определен».
Добавление
using namespace <MyNamespace>
или используя класс, как
MyNamespace::MyClass myClass;
решил проблему.
5
В C и C ++ все имена должны быть объявлены перед использованием. Если вы попытаетесь использовать имя переменной или функции, которая не была объявлена, вы получите ошибку «необъявленный идентификатор».
Однако функции — это особый случай в C (и только в C), в котором вам не нужно сначала объявлять их. Компилятор C будет предполагать, что функция существует с числом и типом аргументов, как в вызове. Если фактическое определение функции не совпадает, вы получите еще одну ошибку. Этот особый случай для функций не существует в C ++.
Вы исправляете ошибки такого рода, проверяя, что функции и переменные объявлены до их использования. В случае printf вам нужно включить заголовочный файл <stdio.h> (или же <cstdio> в C ++).
Для стандартных функций я рекомендую вам проверить, например, этот справочный сайт, и найдите функции, которые вы хотите использовать. Документация для каждой функции говорит вам, какой заголовочный файл вам нужен.
4
Эти сообщения об ошибках
1.For the Visual Studio compiler: error C2065: 'printf' : undeclared identifier
2.For the GCC compiler: `printf' undeclared (first use in this function)
означает, что вы используете имя printf но компилятор не видит, где было объявлено имя, и, соответственно, не знает, что это значит.
Любое имя, используемое в программе, должно быть объявлено до ее использования. Компилятор должен знать, что обозначает имя.
В этом конкретном случае компилятор не видит объявление имени printf , Как мы знаем (но не компилятор) это имя стандартной функции C, объявленной в заголовке <stdio.h> в C или в заголовке <cstdio> в C ++ и размещены в стандарте (std::) и глобальный (::) (не обязательно) пространства имен.
Поэтому, прежде чем использовать эту функцию, мы должны предоставить объявление ее имени компилятору путем включения соответствующих заголовков.
Например
C:
#include <stdio.h>
int main( void )
{
printf( "Hello Worldn" );
}
C ++:
#include <cstdio>
int main()
{
std::printf( "Hello Worldn" );
// or printf( "Hello Worldn" );
// or ::printf( "Hello Worldn" );
}
Иногда причиной такой ошибки является простая опечатка. Например, давайте предположим, что вы определили функцию PrintHello
void PrintHello()
{
std::printf( "Hello Worldn" );
}
но в основном вы сделали опечатку и вместо PrintHello ты напечатал printHello с строчной буквы «р».
#include <cstdio>
void PrintHello()
{
std::printf( "Hello Worldn" );
}
int main()
{
printHello();
}
В этом случае компилятор выдаст такую ошибку, потому что он не видит объявление имени printHello, PrintHello а также printHello два разных имени, одно из которых было объявлено, а другое не объявлено, но используется в теле основного
3
Это похоже на использование функции без ее объявления. заголовочный файл будет содержать
функция printf (). Включите заголовочный файл в вашу программу, это решение для этого.
Некоторые пользовательские функции могут также вызывать ошибки, если они не были объявлены перед использованием. Если
это используется во всем мире без проб.
0
В большинстве случаев, если вы уверены, что импортировали данную библиотеку, Visual Studio поможет вам с IntelliSense.
Вот что сработало для меня:
Удостоверься что #include "stdafx.h" объявляется первым, то есть вверху всех ваших включений.
0
У меня есть эта часть запроса Oracle SQL (намного больше, что не относится к вопросу) …
authorw as (
select a.id, (sum(p.w)) "theWeightOfTheAuthor"
from ac a, pc p, authorpublication ap
where a.id = ap.aid and ap.pid = p.id
group by a.id)
select authorCount.id "ID", auth.name "NAME", authorCount.c "TOTAL_NUMBER_OF_PUBS",
athw.theWeightOfTheAuthor "W_SCORE",
(authorCount.C / athw.theWeightOfTheAuthor) "MULT"
from ac authorCount, authorw athw, Author auth
where authorCount.id = athw.id and authorCount.id = auth.id
order by TOTAL_NUMBER_OF_PUBS desc;
Где я получаю сообщение об ошибке:
ORA-00904: "ATHW"."THEWEIGHTOFTHEAUTHOR": invalid identifier
00904. 00000 - "%s: invalid identifier"
*Cause:
*Action:
Error at Line: 404 Column: 22
Строка 404 является четвертой после последней строки:
(authorCount.C / athw.theWeightOfTheAuthor) "MULT"
ПРИМЕЧАНИЕ. Я могу получить доступ к athw.id очень хорошо, и если я выполню до создания authorw, таблица будет распечатана правильно со столбцом theWeightOfTheAuthor, как и ожидалось. Что дает?
2 ответа
Лучший ответ
Либо удалите кавычки вокруг "theWeightOfTheAuthor", когда вы его определяете, либо добавьте кавычки, когда вы его используете. Заключение имени в кавычки при его определении делает имя чувствительным к регистру, и поскольку Oracle меняет все идентификаторы, не заключенные в кавычки, на ВЕРХНИЙ РЕГИСТР, ваша ссылка на поле фактически ищет ATHW.THEWEIGHTOFTHEAUTHOR, которого не существует.
Основное правило программирования Oracle — никогда не цитировать идентификаторы. Это боль. Просто не делай этого.
Удачи.
2
Bob Jarvis — Reinstate Monica
5 Окт 2017 в 02:55
Вы указали псевдоним столбца в двойных кавычках со смешанным регистром, как "theWeightOfTheAuthor". Когда вы используете двойные кавычки для имени столбца, Oracle сохраняет регистр. Когда вы обращаетесь к нему без кавычек, как athw.theWeightOfTheAuthor, Oracle автоматически преобразует его в верхний регистр. Итак, эти два понятия не совпадают.
Я предлагаю удалить двойные кавычки из псевдонима, чтобы он также интерпретировался как заглавные. В качестве альтернативы вы можете использовать двойные кавычки для всех ссылок на этот столбец, но я не вижу никакой пользы от использования смешанного регистра в имени столбца. (Вы все еще можете написать его как смешанный регистр для удобства чтения, но Oracle будет рассматривать его как полностью прописные.)
0
Dave Costa
5 Окт 2017 в 02:55