0 / 0 / 0
Регистрация: 16.05.2022
Сообщений: 14
1

Библиотеки и классы в с++, принцип работы и добавления своих библиотек в проект

16.05.2022, 18:53. Показов 822. Ответов 20

Добрый день. Недавно начал изучать с++ по книге Стивена Прата. В данный момент на 10-й главе. Автор описывает использование #ifndef #indif в заголовочных файлах. Немного забежав вперед и прочитав про создание библиотек для Arduino возникло много вопросов. Скажем есть заголовочный файл Test.h и определение класса Test.cpp и основной файл TestLib.cpp.
По книге в основном файле для работы автор подключает только Test.h как собственно и в определении Test.cpp. Я работаю в программе VS code без включения определения Test.cpp в основной файл TestLib.cpp программа не компилируется. Пробовал компилировать через командную строку как по книге и здесь получается необходимо указать 2 файла g++ TestLib.cpp Test.cpp
или включать в основной файл TestLib.cpp определение класса Test.cpp в таком случае команда g++ TestLib.cpp выполняется.
Для Arduino как я понял достаточно в IDE подключать только заголовочный файл, почему не определение как это получается с VS code и командной строкой? Какой тогда мы подключаем файл, используя директиву #Include<iostream> VS code указывает на файл с расширением .cpp, в библиотеках minGW я нашёл только файл с расширением .h
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.05.2022, 18:53
Ответы с готовыми решениями:

Загрузить ресурсы, библиотеки, классы и т.д. из архива во время работы приложения
Как мне загрузить ресурсы, библиотеки, классы и т.д. из zip архива (который находится в памяти...

Cобытийность. Принцип использования и принцип работы событий в jQ и GCT
Добрый день. Подготавливаюсь к собеседованию по чеклисту и не могу найти ответ на вопрос:...

Подключение своих библиотек
Ошибка: не удается открыть источник файл &quot;mystruct.h&quot;. Все бы ничего, если бы не написал...

Подключение своих библиотек к VS
Со временем накопились у меня различные функции, которые удобно использовать в своих проектах....

Статический Qt не видит своих библиотек
Добрый день. Сделал статическую сборку Qt как написано в руководстве в прикрепленных темах. Хотел...

20
0 / 0 / 0
Регистрация: 16.05.2022
Сообщений: 14
16.05.2022, 19:48  [ТС] 2
В том и дело что у меня выходит что программа не компилируется без файла определения, хотя судя по книге и по статье должна с заголовочным файлом.
0
5233 / 2887 / 1208
Регистрация: 07.02.2019
Сообщений: 7,284
16.05.2022, 19:51 3
Цитата Сообщение от Gronfindel Посмотреть сообщение
хотя судя по книге и по статье должна с заголовочным файлом
Компилироваться должно, а вот компоноваться(линковаться) в исполняемый файл не должно.
Что там по статье мы опустим (извиняюсь за ссылку на голь), а вот цитату из книги, пример с содержанием файлов, ошибку компиляции/линковки прошу показать, чтобы был предмет разговора.
0
0 / 0 / 0
Регистрация: 16.05.2022
Сообщений: 14
16.05.2022, 19:59  [ТС] 4
Цитата Сообщение от zayats80888 Посмотреть сообщение
Компилироваться должно, а вот компоноваться(линковаться) в исполняемый файл не должно.
Тогда объясните почему не должно? Просмотрев через VS code библиотеку iostream пришел к выводу что сама библиотека-это так называемый файл определения, а файл .h это заголовочный который необходим только для ознакомления с библиотекой.
Цитата Сообщение от zayats80888 Посмотреть сообщение
Что там по статье мы опустим (извиняюсь за ссылку на голь), а вот цитату из книги, пример с содержанием файлов, ошибку компиляции/линковки прошу показать, чтобы был предмет разговора.
В том и дело что Стивен Прат запускает компиляцию через командную строку следующей командой g++ TestLib.cpp Test.cpp, В таком случае да в файле TestLib.cpp подключать файл определения Test.cpp не нужно.
0
5233 / 2887 / 1208
Регистрация: 07.02.2019
Сообщений: 7,284
16.05.2022, 20:03 5
Цитата Сообщение от Gronfindel Посмотреть сообщение
Какой тогда мы подключаем файл, используя директиву #Include<iostream>
Это заголовочный файл(который подключает другие заголовочные файлы и т.д.) Объектный код("реализация"), на который есть ссылки в этих заголовках, находится в стандартных библиотеках C и С++(напр., libc и libstdc++), которые компилятор "подтягивает" линковщику автоматически.
Цитата Сообщение от Gronfindel Посмотреть сообщение
В том и дело что Стивен Прат запускает компиляцию через командную строку следующей командой g++ TestLib.cpp Test.cpp
Эти два файла - две единицы трансляции, которые скомпилируются отдельно в два объектных файла, а затем компоновщиком "объединятся" в один исполняемый файл.
0
0 / 0 / 0
Регистрация: 16.05.2022
Сообщений: 14
16.05.2022, 20:39  [ТС] 6
Цитата Сообщение от zayats80888 Посмотреть сообщение
Это заголовочный файл(который подключает другие заголовочные файлы и т.д.) Объектный код("реализация"), на который есть ссылки в этих заголовках, находится в стандартных библиотеках C и С++(напр., libc и libstdc++), которые компилятор "подтягивает" линковщику автоматически.
Почему тогда в моем случае компилятору не достаточно в основной программе заголовочного файла Test.h, он обязательно требует Test.cpp?
Или в заголовочном файле Test.h мы должны подключать файл Test.cpp определения?

Добавлено через 7 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#ifndef FourTack4_h_
#define FourTack4_h_
namespace SALES
{
    const int QUARTES=4;
    struct Sales
    {
        double sales[QUARTES];
        double average;
        double max;
        double min;
    };
    void setSales(Sales &s, const double ar[],int n);
    void setSales(Sales&s);
    void showSales(const Sales&s);
}
#endif
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include"FourthTack4-2.cpp"
#include"FourthTack4.h"
#include<iostream>
int main()
{
    SALES::Sales s1;
    SALES::setSales(s1);
    SALES::showSales(s1);
    double arr[SALES::QUARTES]={258.34,308.59,150.698,385.27};
    SALES::Sales s2;
    SALES::setSales(s2,arr,SALES::QUARTES);
    SALES::showSales(s2);
    return 0;
}
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
39
40
41
42
43
44
45
46
47
48
#include"FourthTack4.h"
#include<iostream>
namespace SALES
{
    void setSales(Sales &s, const double ar[], int n)
    {
        double average=0.0;
        s.min=ar[0];
        for (int i = 0; i < QUARTES; i++)
        {
            s.sales[i]=ar[i];
            if (s.min>ar[i])
                s.min=ar[i];
            else if(s.max<ar[i])
                s.max=ar[i];
            average+=ar[i];
        }
        s.average=average/QUARTES;
    }
    void setSales(Sales &s)
    {
        using namespace std;
        double average = 0.0;
        for (int i = 0; i < QUARTES; i++)
        {
            cout << "Enter " << i + 1 << " quarterly sales: ";cin>>s.sales[i];
            average += s.sales[i];
        }
        s.min = s.sales[0];
        for (int i = 0; i < QUARTES; i++)
        {;
            if (s.min > s.sales[i])
                s.min = s.sales[i];
            else if (s.max < s.sales[i])
                s.max = s.sales[i];
        }
        s.average = average / QUARTES;
    }
    void showSales(const Sales &s)
    {
        using namespace std;
        for (int i = 0; i < QUARTES; i++)
            cout<<i+1<<" element of array: "<<s.sales[i]<<endl;
        cout<<"Array average: "<<(double)s.average<<endl;
        cout<<"Array minimum: "<<(double)s.min<<endl;
        cout<<"Array maximum: "<<(double)s.max<<endl;
    }
}
Если рассматривать конкретный пример, почему для файла FourthTack4-3.cpp недостаточно заголовочного файла FourthTack4.h?
0
5233 / 2887 / 1208
Регистрация: 07.02.2019
Сообщений: 7,284
16.05.2022, 20:57 7
Цитата Сообщение от Gronfindel Посмотреть сообщение
Почему тогда в моем случае компилятору не достаточно в основной программе заголовочного файла Test.h, он обязательно требует Test.cpp?
А откуда тогда компоновщик возьмет определения сущностей, которые объявлены в Test.h? Со стандартными библиотеками все автоматизирмованно, т.к. они стандартные(скажем так, они неявно указываются в параметрах командной строки). Про ваш Test.cpp никому кроме вас не известно.
Цитата Сообщение от Gronfindel Посмотреть сообщение
Или в заголовочном файле Test.h мы должны подключать файл Test.cpp определения?
Нет, не должны. Директива #include просто подставляет содержимое файла в это место.
0
0 / 0 / 0
Регистрация: 16.05.2022
Сообщений: 14
16.05.2022, 21:03  [ТС] 8
Цитата Сообщение от zayats80888 Посмотреть сообщение
А откуда тогда компоновщик возьмет определения сущностей, которые объявлены в Test.h? Со стандартными библиотеками все автоматизирмованно, т.к. они стандартные(скажем так, они неявно указываются в параметрах командной строки). Про ваш Test.cpp никому кроме вас не известно.
Ну если верить данной статье то IDE Arduino знает как через заголовочный файл найти определение.
0
5233 / 2887 / 1208
Регистрация: 07.02.2019
Сообщений: 7,284
16.05.2022, 21:11 9
Цитата Сообщение от Gronfindel Посмотреть сообщение
Ну если верить данной статье то IDE Arduino знает как через заголовочный файл найти определение.
1) Какой статье?
2) IDE - это не компилятор, это программа с графическим интерфейсом, которая вызывает компилятор и передает ему нужные параметры исходя из настроек, которые вы в этом интерфейсе ему натыкали(в том числе и файлы, которые вы прикрепили к проекту). Это просто обёртка для работы с утилитами из комплекта компилятора.
0
0 / 0 / 0
Регистрация: 16.05.2022
Сообщений: 14
16.05.2022, 21:25  [ТС] 10
Цитата Сообщение от zayats80888 Посмотреть сообщение
1) Какой статье?
Этой https://alexgyver.ru/lessons/library-writing/
Цитата Сообщение от zayats80888 Посмотреть сообщение
2) IDE - это не компилятор, это программа с графическим интерфейсом, которая вызывает компилятор и передает ему нужные параметры исходя из настроек, которые вы в этом интерфейсе ему натыкали(в том числе и файлы, которые вы прикрепили к проекту). Это просто обёртка для работы с утилитами из комплекта компилятора.
Это я понимаю, сейчас протестировал у себя точно такой же код как в ролике https://www.youtube.com/watch?... SimpleCode в нем как раз все работает как описано в книге и запуске из командной строки.
Выходит что IDE arduino и IDE Visial Studio уже имеют на борту нечто что позволяет собирать и компоновать много файловые программы, VS code как я предполагаю этого не умеет или только через костыли.
0
5233 / 2887 / 1208
Регистрация: 07.02.2019
Сообщений: 7,284
16.05.2022, 21:33 11
Цитата Сообщение от Gronfindel Посмотреть сообщение
VS code как я предполагаю этого не умеет или только через костыли
Это не IDE, а текстовый редактор с "плюшками". В качестве "костыля" на него можно установить универсальную и мощную систему сборки CMake, что упростит разработку(хотя и она не для новичков).
1
0 / 0 / 0
Регистрация: 16.05.2022
Сообщений: 14
16.05.2022, 21:45  [ТС] 12
Цитата Сообщение от zayats80888 Посмотреть сообщение
Это не IDE, а текстовый редактор с "плюшками". В качестве "костыля" на него можно установить универсальную и мощную систему сборки CMake, что упростит разработку(хотя и она не для новичков).
Да я знаю что это мощный блокнот, но благодаря ему как показывает практика иногда возникают вопросы которых бы не было будь то Студия. Ответ на свой вопрос получается я нашел по ссылке:


Добавлено через 6 минут
0
С чаем беда...
Эксперт CЭксперт С++
9993 / 5345 / 1461
Регистрация: 18.10.2014
Сообщений: 12,864
16.05.2022, 21:46 13
Лучший ответ Сообщение было отмечено Gronfindel как решение

Решение

Цитата Сообщение от Gronfindel Посмотреть сообщение
Для Arduino как я понял достаточно в IDE подключать только заголовочный файл, почему не определение как это получается с VS code и командной строкой?
Потому что для упрощения процесса Arduino IDE просто тупо включает все .ino/.c/.cpp файлы в проект за вас.

Это относится и ко всем "вашим" файлам, т.е. файлам в директории вашего проекта. Это относится и к файлам посторонних библиотек: как только вы включили заголовочный файл некоей библиотеки, Arduino IDE тянет за ним и все .c/.cpp файлы из каталога библиотеки.
1
0 / 0 / 0
Регистрация: 16.05.2022
Сообщений: 14
16.05.2022, 21:51  [ТС] 14
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Потому что для упрощения процесса Arduino IDE просто включает все .c/.cpp файлы в проект за вас.
Да, я уже разобрался с этим благодаря(файл во вложении, пчм не могу оставить ссылку загадка) спасибо
Здесь более подробно этот процесс описан:https://habr.com/ru/post/478124/
Миниатюры
Библиотеки и классы в с++, принцип работы и добавления своих библиотек в проект  
0
0 / 0 / 0
Регистрация: 16.05.2022
Сообщений: 14
16.05.2022, 22:12  [ТС] 15
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Потому что для упрощения процесса Arduino IDE просто тупо включает все .ino/.c/.cpp файлы в проект за вас.
Как Arduino IDE узнает что необходимо вложить еще и .cpp файл подключить если подключаем через #include "....h" файл?
0
С чаем беда...
Эксперт CЭксперт С++
9993 / 5345 / 1461
Регистрация: 18.10.2014
Сообщений: 12,864
16.05.2022, 22:18 16
Цитата Сообщение от Gronfindel Посмотреть сообщение
Как Arduino IDE узнает что необходимо вложить еще и .cpp файл подключить если подключаем через #include "....h" файл?
О чем речь вообще? При чем здесь "если подключаем через #include "....h" файл"???

Я же ясно написал: Arduino IDE компилирует вообще все .c/.cpp файлы в вашем каталоге. Никакое "#include "....h" файл" не имеет никакого значения вообще. Компилируются в одну кучу подряд все .c/.cpp файлы без исключения.

Это что касается ваших личных файлов.

Что касается посторонних библиотек - я тоже все ясно описал выше. Что именно вам не понятно?
0
0 / 0 / 0
Регистрация: 16.05.2022
Сообщений: 14
17.05.2022, 21:08  [ТС] 17
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Что касается посторонних библиотек - я тоже все ясно описал выше. Что именно вам не понятно?
Почему в таком случае VS code не подтягивает таким образом файлы, если сравнивать со iostream мы ведь подключаем заголовочный файл? Или все же со стандартными библиотеками есть какая то хитрость?
0
С чаем беда...
Эксперт CЭксперт С++
9993 / 5345 / 1461
Регистрация: 18.10.2014
Сообщений: 12,864
17.05.2022, 21:35 18
Цитата Сообщение от Gronfindel Посмотреть сообщение
Почему в таком случае VS code не подтягивает таким образом файлы
Потому что никто "не подтягивает таким образом файлы". Нет такой практики в мире С или С++. Никакое автоматическое "подтягивание файлов" никому не нужно. Все "подтягивают" самостоятельно, ручками.

Исключением является лишь Arduino IDE, котрое решило таким образом "облегчить жизнь начинающим программистам" (или, переводя на русский, попытаться покрыть коммерческим охватом большую доильную аудиторию), реализовав автоматическое подтягивание по принципу "тупо тянем все без разбору".

Цитата Сообщение от Gronfindel Посмотреть сообщение
если сравнивать со iostream мы ведь подключаем заголовочный файл?
Не понял ссылку на iostream. При чем здесь iostream и заголовочный файл? iostream - часть стандартной библиотеки. Ее не надо "подтягивать" - она всегда и так "подтянута".

Какое это имеет отношение к теме?

Добавлено через 5 минут
Цитата Сообщение от Gronfindel Посмотреть сообщение
Какой тогда мы подключаем файл, используя директиву #Include<iostream>
Во-первых, нет никакого #Include. Есть #include

Во-вторых, директива #include <> не рабоатет с файлами. Она работает со стандартными заголовками, которые концептуально не являются файлами вообще.

Цитата Сообщение от Gronfindel Посмотреть сообщение
VS code указывает на файл с расширением .cpp
О чем речь вообще? Что за "файл с расширением .cpp" и при чем он здесь?
0
0 / 0 / 0
Регистрация: 16.05.2022
Сообщений: 14
17.05.2022, 21:58  [ТС] 19
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Не понял ссылку на iostream. При чем здесь iostream и заголовочный файл? iostream - часть стандартной библиотеки. Ее не надо "подтягивать" - она всегда и так "подтянута".
Но пока мы не включим ее в свой файл то и пользоваться ей не сможем. Что именно мы подключаем строкой #include<iostream>, заголовочный файл или файл с определением? Если заголовочный то каким образом в нем реализована ссылка на файл с определениями?
0
С чаем беда...
Эксперт CЭксперт С++
9993 / 5345 / 1461
Регистрация: 18.10.2014
Сообщений: 12,864
17.05.2022, 22:09 20
Цитата Сообщение от Gronfindel Посмотреть сообщение
Но пока мы не включим ее в свой файл то и пользоваться ей не сможем.
Так всегда. В С++ обязательно нужно объявлять сущности перед их использованием. (Однако не вижу связи с темой.)

Цитата Сообщение от Gronfindel Посмотреть сообщение
Что именно мы подключаем строкой #include<iostream>, заголовочный файл
Мы подключаем стандартный заголовок. Стандартный заголовок - это не файл, а некая абстрактная сущность, привносящая в наш код некий набор стандартных объявлений.

Цитата Сообщение от Gronfindel Посмотреть сообщение
или файл с определением?
Странный вопрос. В языке С++ заголовки и заголовочные файлы могут запросто содержать не только объявления, но и определения тоже. Например, определения шаблонов, определения inline сущностей и т.п. Многие библиотеки в С++ состоят только из заголовочных файлов - т.наз. header-only libraries.

Но в общем случае - нет. Когда мы подключаем заголовочный файл, мы подключаем только объявления. Файл реализации (или библиотеку) с определениями нам придется включать в проект отдельно и самостоятельно. Вручную.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.05.2022, 22:09
Помогаю со студенческими работами здесь

Подгрузка своих библиотек на Android
Доброго времени суток, господа) Не могли бы вы поделиться опытом? 1) Я сделал приложение на...

Правильное использование своих библиотек в модели
Здравствуйте, есть самописная библиотека по решению матриц - Matrix Как мне лучше (правильнее)...

QLibrary и загрузка своих библиотек в Linux
Добрый день! В Linux новичок, прошу помочь разобраться с настройками проекта. Есть проект с GUI ...

CodeIgniter 2.2.0: подключение внешних (своих) библиотек
Всем доброго времени. Столкнулся со следующей проблемой и пока не могу понять в чем причина. Сразу...

Подключение своих созданных библиотек к проекту
Хочу создать библиотеку классов и потом ее использовать! как создать понимаю. а вот как ее потом...

Принцип добавления данных Firebase database?
Здравствуйте всем! не могу понять как firebase сохраняет данные? я 4 дня добавлял данные дня...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru