С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.84/25: Рейтинг темы: голосов - 25, средняя оценка - 4.84
7 / 7 / 0
Регистрация: 26.11.2018
Сообщений: 262

компиляция нескольких файлов GCC

23.01.2020, 15:02. Показов 5581. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
У меня есть 4 файлы.
main.c
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>
 
#include "main.h"
#include "file_1.h"
 
int test_value_1=111;
int test_value_2=222;
 
 
int main()
{
    printf("Main file:\r\n");
    printf("Value from main file:%d, %d\r\n",test_value_1, test_value_2);
 
  printf("file_1:\r\n");
    printf("Value from file_1: %d, %d\r\n", val_from_file_1, val_from_file_2);
 
  //func_1_file_1();
    //printf("Value from file_1: %d\r\n", val_for_file_1);
 
 
 
    return 0;
}
main.h
C
1
2
3
4
#include <stdio.h>
 
int test_value_1;
int test_value_2;
file_1.c
C
1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
 
#include "file_1.h"
 
int val_for_file_1=200;
int val_for_file_2=500;
 
void func_1_file_1(void)
{
    val_for_file_1++;
}
file_1.h
C
1
2
3
4
5
6
#include <stdio.h>
 
int val_from_file_1;
int val_from_file_2;
 
void func_1_file_1(void);
в build.sh я записываю команду:
gcc -Wall main.c -o myprog
программа компилируется, и появляется исполняемый файл 'myprog'$'\r'*
Запускаю его ./'myprog'$'\r'*
Результат:
Main file:
Value from main file:111, 222
file_1:
Value from file_1: 0, 0

Не понимаю почему выводятся переменниє val_from_file_1, val_from_file_2? почему они 0 а не 200 и 500??
Я не так компилирую или не так использую .h файл.?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
23.01.2020, 15:02
Ответы с готовыми решениями:

Компиляция нескольких файлов
Создал проект на wxDevC++ таким образом: потом создал три файла в проекте: coordin.h #ifndef COORDIN_H_ #define COORDIN_H_...

Компиляция нескольких файлов
Здравствуйте, есть программа состоящая из 4 cpp, необходимо ее собрать, попытался собрать с помощью MinGW(взял тут...

Компиляция и компоновка нескольких файлов
Добрый день уважаемые форумчане. Продолжая изучать учебник &quot;How to Prgoramm C++&quot; я наткнулся на материал, в котором описывается код, точнее...

4
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,907
23.01.2020, 15:39
Лучший ответ Сообщение было отмечено OlegD_STM32 как решение

Решение

Потому что вы компилируете только один файл, main.c. В него включены (грубо говоря, скопированы) файлы main.h и file_1.h. То есть для компилятора файл main.c выглядит так:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <stdio.h>
 
//---#include "main.h"---
#include <stdio.h>
 
int test_value_1;
int test_value_2;
//---end of main.h---
 
//---#include "file_1.h"---
#include <stdio.h>
 
int val_from_file_1;
int val_from_file_2;
 
void func_1_file_1(void);
//---end of file_1.h---
 
 
int test_value_1=111;
int test_value_2=222;
 
 
int main()
{
    printf("Main file:\r\n");
    printf("Value from main file:%d, %d\r\n",test_value_1, test_value_2);
 
  printf("file_1:\r\n");
    printf("Value from file_1: %d, %d\r\n", val_from_file_1, val_from_file_2);
 
  //func_1_file_1();
    //printf("Value from file_1: %d\r\n", val_for_file_1);
 
 
 
    return 0;
}
Как видите, переменные объявлены, но не инициализированы. Сколько помню, по стандарту глобальные переменные инициализируются нулями, если не сказано иного.
Функция func_1_file_1() объявлена но не определена. Если бы вы попытались ее вызвать, произошла бы ошибка, а так ошибку компилятор вам просто написал, что вы успешно проигнорировали.
А файл file_1.c как лежал невостребованный, так и продолжает лежать. Его надо было скомпилировать вместе с main.c:
gcc -Wall main.c file_1.c -o myprog
Второе: никогда не объявляйте переменные в заголовочном файле. Заголовочник для того и предназначен, чтобы подключаться к нескольким файлам исходного кода. Соответственно, в разных местах программы у вас будут разные переменные с одним и тем же именем. Компилятор такого не потерпит.
Если вы хотите использовать переменные из одного исходного кода в другом, используйте директиву extern:
C
1
2
3
4
5
6
#include <stdio.h>
 
extern int val_from_file_1;
extern int val_from_file_2;
 
void func_1_file_1(void);
Это говорит компилятору, что "вот такие переменные где-то точно есть, но не здесь". Соответственно, сами переменные создаете только в одном файле.
1
 Аватар для Mesteriis
599 / 237 / 69
Регистрация: 08.08.2015
Сообщений: 1,637
23.01.2020, 15:46
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Заголовочник для того и предназначен, чтобы подключаться к нескольким файлам исходного кода.
Или всегда можно использовать макросы
C++
1
2
3
#ifndef 
#define 
#endif
что обеспечит исключения двойного объявления
1
7 / 7 / 0
Регистрация: 26.11.2018
Сообщений: 262
23.01.2020, 16:00  [ТС]
компилирует теперь так: gcc -Wall main.c file_1.c -o myprog
И добавил extern в file_1.h
main.c
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
 
#include "main.h"
#include "file_1.h"
 
int test_value_1=111;
int test_value_2=222;
 
int main()
{
    printf("Main file:\r\n");
    printf("Value from main file:%d, %d\r\n",test_value_1, test_value_2);
 
  printf("file_1:\r\n");
    printf("val_from_file_1: %d\r\n", val_from_file_1);
  printf("val_from_file_2: %d\r\n", val_from_file_2);
  //func_1_file_1();
    //printf("Value from file_1: %d\r\n", val_for_file_1);
 
 
 
    return 0;
}
main.h
C
1
2
3
4
#include <stdio.h>
 
int test_value_1;
int test_value_2;
file_1.c
C
1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
 
#include "file_1.h"
 
int val_for_file_1=200;
int val_for_file_2=500;
 
void func_1_file_1(void)
{
    val_for_file_1++;
}
file_1.h
C
1
2
3
4
5
6
#include <stdio.h>
 
extern int val_from_file_1;
extern int val_from_file_2;
 
void func_1_file_1(void);
после компиляции:
/tmp/ccsVHUeC.o: In function `main':
main.c.text+0x3d): undefined reference to `val_from_file_1'
main.c.text+0x56): undefined reference to `val_from_file_2'
collect2: error: ld returned 1 exit status

Добавлено через 5 минут
COKPOWEHEU,
Заработало, я назвал не так переменные.
Спасибо всем
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,907
23.01.2020, 17:43
Цитата Сообщение от Mesteriis Посмотреть сообщение
что обеспечит исключения двойного объявления
Это само собой, но от ошибки объявления переменных в двух единицах трансляции не спасет. Надо использовать и #ifndef+#define+#endif и модификатор extern.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
23.01.2020, 17:43
Помогаю со студенческими работами здесь

Компиляция нескольких файлов со структурами C++
Доброго времени суток! Начал работать с разделением программы на файлы и, как следовало ожидать, наткнулся на ошибки. Реализованы...

Компиляция gcc
Подскажите как в VS скомпилировать программу с помощью компилятора gcc

gcc компиляция
Проблема возникла при компиляции проекта code::block. При build and run все работает, в папке bin проекта появляется .exe Но...

Компиляция (gcc)
Добрый вечер! После компиляции текстовый файл становится вдруг двоичным, как следствие его невозможно открыть для исправлений. Почему? ...

Компиляция проекта в gcc
Здравствуйте, форумчане! Прошу помочь разобраться! Есть программа, представленная в 3х файлах. В первом содержится описание класса...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru