Я создал два основных файла .cpp. Первый состоит всего из одной строки кода:
int var=10;
, а второй такой:
#include <iostream>
using namespace std;
int main(){
cout<<var;
return 0;
}
Я компилирую свой код с помощью gcc -o myprogram file1.cpp file2.cpp
и всегда получаю это сообщение:
error: ‘var’ was not declared in this scope
13 | cout<<var;
Кто-нибудь знает, как это решить?
@ggorlen Теперь я получаю это сообщение: collect2: ошибка: ld вернул 1 статус выхода
У меня работает нормально, поэтому ваш код или команда компилятора должны отличаться от того, что вы показали здесь.
@ggorlen, так как мне запустить код с помощью g++, я смог его скомпилировать, но не знаю, как его запустить. (Я новичок в программировании, так что извините, если это глупый вопрос, лол)
Нет проблем, мы все были новичками в какой-то момент. Возьмите файл, который вы показали, как есть, добавьте extern int var;
выше int main
, затем скомпилируйте и запустите с g++ -o myprogram learn.cpp help.cpp && ./myprogram
. g++
— это компилятор, а не программа запуска. Он создает исполняемый двоичный файл из вашего исходного кода. Вы на какой ОС? Кроме того, возьмите хорошую книгу по C++, любая книга для начинающих проведет вас через все это.
@ggorlen linux, ubuntu, если это имеет значение
Хорошо мне тоже. Приведенные выше команды должны работать нормально. Дайте нам знать, как это происходит.
@ggorlen спасибо, сработало
Вы пытаетесь скомпилировать C++ с помощью компилятора C. Это не сработает.
видимо этот вопрос был значительно отредактирован - его нужно закрыть. Ответы больше не соответствуют вопросу.
@ bb_823 - Пожалуйста, "проголосуйте" и "примите" мой ответ (с последующей веткой), если вы нашли его полезным. Или, если хотите, «проголосуйте» за мой ответ и «примите» ваш ответ.
@ bb_823 Я вернул ваш вопрос к исходному вопросу. В будущем, пожалуйста, воздержитесь от редактирования ваших вопросов таким образом, чтобы сделать существующие ответы недействительными. Вместо этого вы должны задать новый вопрос в таких ситуациях.
Если "var" одноразовый, то просто добавьте extern:
#include <iostream>
using namespace std;
extern int var;
int main(){
cout<<var;
return 0;
}
Если ваш «первый .cpp» растет, и вы начинаете добавлять вещи, которые захотят использовать другие модули, то вы, вероятно, захотите:
А если не разовый?
Я пробовал это, и я получаю это сообщение: /usr/bin/ld: /tmp/ccAQZ8HD.o: in function `main': file2.cpp:(.text+0x13): undefined reference to `std::cout' /usr/bin/ld: file2.cpp:(.text+0x18): undefined reference to `std::ostream::operator<<(int)' /usr/bin/ld: /tmp/ccAQZ8HD.o: in function `__static_initialization_and_destruction_0(int, int)': file2.cpp:(.text+0x4c): undefined reference to `std::ios_base::Init::Init()' /usr/bin/ld: file2.cpp:(.text+0x61): undefined reference to `std::ios_base::Init::~Init()' collect2: error: ld returned 1 exit status
@bb_823: код, который вы разместили (без «extern»), даст вам ошибку компиляции ‘var’ was not declared in this scope
. Если вы что-то изменили, пожалуйста, «отредактируйте» свой пост: 1) добавьте новый, измененный код, 2) скопируйте/вставьте полный текст нового сообщения об ошибке
@bb_823: Используйте g++
для компиляции программ на C++. Простого добавления .cpp недостаточно :( "gcc" предназначен только для программ "C"; "g++" может компилировать исходные файлы C (.c) или C++ (.cpp).
@ paulsm4 paulsm4, так как мне запустить код с помощью g++, я смог его скомпилировать, но не знаю, как его запустить. (Я новичок в программировании, так что извините, если это глупый вопрос, лол)
В: так как мне запустить код с помощью g++? А: Вы не знаете. Вы просто создаете код (в исполняемую программу) с помощью g++. Затем вы можете запустить его, как и любую другую программу :) Поскольку вы работаете в Linux, я бы набрал g++ -Wall -g file1.cpp file2.cpp -o myapp
для сборки, а затем ./myapp
(как бы ни называлась ваша программа) из окна терминала, чтобы запустить ее.
Как это исправить, что он использует неправильный компилятор?
@xaxxon - ОП отредактировал свой пост; он удалил первую проблему (ошибка компиляции из-за отсутствия «extern») и добавил другую, вторую проблему (ошибка ссылки, использование неправильного компилятора).
Каждая единица перевода должна содержать объявление каждого используемого символа. С другой стороны, каждый символ должен иметь определение ровно в одной единице перевода (если это не явно или неявно inline
; тогда несколько единиц перевода могут иметь определения, если они все одинаковы).
Обычный способ сделать это — поместить объявления вещей в заголовочный файл, который вы затем #include
разместите в нескольких единицах перевода, а их определения поместите в файл .cpp, который формирует основную часть единицы перевода.
В этом конкретном случае вам нужно объявление var
в единице перевода, которая содержит main
. Вы можете поместить его в заголовок, который получает #include
d в файле1.cpp; то есть:
файл2.hpp:
#ifndef FILE1_HPP
#define FILE1_HPP
extern int var;
#endif
файл2.cpp:
#include "file2.hpp"
int var;
файл1.cpp:
#include "file2.hpp"
#include <iostream>
int main() {
std::cout << var;
}
Или вы просто помещаете его в эту единицу перевода вручную; то есть
#include <iostream>
extern int var;
int main()
{
std::cout << var;
}
Любой подход абсолютно одинаков с точки зрения компилятора (препроцессор просто выполняет замену текста), но последний, как правило, гораздо сложнее для людей, поэтому вам, вероятно, следует избегать его вообще.
Как это исправить, что он использует неправильный компилятор?
@xaxxon Вопрос был изменен после того, как я написал этот ответ.
В основном проблема заключалась в том, что я использовал gcc -o myprogram learn.cpp help.cpp
вместо g++ -o myprogram learn.cpp help.cpp
для компиляции. Компилятор Gcc используется для файлов .c и g++ для файлов .cpp.
Добро пожаловать в СО! Как насчет
extern int var
в файлеmain
? Это кажется не связанным с vim. Кроме того, не используйте с использованием пространства имен std; и, возможно, использоватьg++
вместоgcc
.