Связывание двух файлов

Я создал два основных файла .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;

Кто-нибудь знает, как это решить?

Добро пожаловать в СО! Как насчет extern int var в файле main? Это кажется не связанным с vim. Кроме того, не используйте с использованием пространства имен std; и, возможно, использовать g++ вместо gcc.

ggorlen 24.12.2020 23:20

@ggorlen Теперь я получаю это сообщение: collect2: ошибка: ld вернул 1 статус выхода

user14883657 24.12.2020 23:23

У меня работает нормально, поэтому ваш код или команда компилятора должны отличаться от того, что вы показали здесь.

ggorlen 24.12.2020 23:24

@ggorlen, так как мне запустить код с помощью g++, я смог его скомпилировать, но не знаю, как его запустить. (Я новичок в программировании, так что извините, если это глупый вопрос, лол)

user14883657 24.12.2020 23:42

Нет проблем, мы все были новичками в какой-то момент. Возьмите файл, который вы показали, как есть, добавьте extern int var; выше int main, затем скомпилируйте и запустите с g++ -o myprogram learn.cpp help.cpp && ./myprogram. g++ — это компилятор, а не программа запуска. Он создает исполняемый двоичный файл из вашего исходного кода. Вы на какой ОС? Кроме того, возьмите хорошую книгу по C++, любая книга для начинающих проведет вас через все это.

ggorlen 24.12.2020 23:45

@ggorlen linux, ubuntu, если это имеет значение

user14883657 24.12.2020 23:46

Хорошо мне тоже. Приведенные выше команды должны работать нормально. Дайте нам знать, как это происходит.

ggorlen 24.12.2020 23:47

@ggorlen спасибо, сработало

user14883657 24.12.2020 23:49

Вы пытаетесь скомпилировать C++ с помощью компилятора C. Это не сработает.

xaxxon 25.12.2020 00:09

видимо этот вопрос был значительно отредактирован - его нужно закрыть. Ответы больше не соответствуют вопросу.

xaxxon 25.12.2020 00:50

@ bb_823 - Пожалуйста, "проголосуйте" и "примите" мой ответ (с последующей веткой), если вы нашли его полезным. Или, если хотите, «проголосуйте» за мой ответ и «примите» ваш ответ.

paulsm4 25.12.2020 00:53

@ bb_823 Я вернул ваш вопрос к исходному вопросу. В будущем, пожалуйста, воздержитесь от редактирования ваших вопросов таким образом, чтобы сделать существующие ответы недействительными. Вместо этого вы должны задать новый вопрос в таких ситуациях.

Miles Budnek 25.12.2020 02:06
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
12
96
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Если "var" одноразовый, то просто добавьте extern:

#include <iostream>

using namespace std;

extern int var; 
           
int main(){
    cout<<var;    
    return 0; 
}

Если ваш «первый .cpp» растет, и вы начинаете добавлять вещи, которые захотят использовать другие модули, то вы, вероятно, захотите:

  • Определите один или несколько классов
  • Создайте заголовочный файл для вашего определения класса.

А если не разовый?

JVApen 24.12.2020 23:22

Я пробовал это, и я получаю это сообщение: /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

user14883657 24.12.2020 23:25

@bb_823: код, который вы разместили (без «extern»), даст вам ошибку компиляции ‘var’ was not declared in this scope. Если вы что-то изменили, пожалуйста, «отредактируйте» свой пост: 1) добавьте новый, измененный код, 2) скопируйте/вставьте полный текст нового сообщения об ошибке

paulsm4 24.12.2020 23:27

@bb_823: Используйте g++ для компиляции программ на C++. Простого добавления .cpp недостаточно :( "gcc" предназначен только для программ "C"; "g++" может компилировать исходные файлы C (.c) или C++ (.cpp).

paulsm4 24.12.2020 23:28

@ paulsm4 paulsm4, так как мне запустить код с помощью g++, я смог его скомпилировать, но не знаю, как его запустить. (Я новичок в программировании, так что извините, если это глупый вопрос, лол)

user14883657 24.12.2020 23:43

В: так как мне запустить код с помощью g++? А: Вы не знаете. Вы просто создаете код (в исполняемую программу) с помощью g++. Затем вы можете запустить его, как и любую другую программу :) Поскольку вы работаете в Linux, я бы набрал g++ -Wall -g file1.cpp file2.cpp -o myapp для сборки, а затем ./myapp (как бы ни называлась ваша программа) из окна терминала, чтобы запустить ее.

paulsm4 24.12.2020 23:54

Как это исправить, что он использует неправильный компилятор?

xaxxon 25.12.2020 00:10

@xaxxon - ОП отредактировал свой пост; он удалил первую проблему (ошибка компиляции из-за отсутствия «extern») и добавил другую, вторую проблему (ошибка ссылки, использование неправильного компилятора).

paulsm4 25.12.2020 00:34

Каждая единица перевода должна содержать объявление каждого используемого символа. С другой стороны, каждый символ должен иметь определение ровно в одной единице перевода (если это не явно или неявно inline; тогда несколько единиц перевода могут иметь определения, если они все одинаковы).

Обычный способ сделать это — поместить объявления вещей в заголовочный файл, который вы затем #include разместите в нескольких единицах перевода, а их определения поместите в файл .cpp, который формирует основную часть единицы перевода.


В этом конкретном случае вам нужно объявление var в единице перевода, которая содержит main. Вы можете поместить его в заголовок, который получает #included в файле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 25.12.2020 00:10

@xaxxon Вопрос был изменен после того, как я написал этот ответ.

Miles Budnek 25.12.2020 02:04
Ответ принят как подходящий

В основном проблема заключалась в том, что я использовал gcc -o myprogram learn.cpp help.cpp вместо g++ -o myprogram learn.cpp help.cpp для компиляции. Компилятор Gcc используется для файлов .c и g++ для файлов .cpp.

Другие вопросы по теме