49 / 34 / 9
Регистрация: 27.12.2017
Сообщений: 1,450
1

Подключение заголовочных файлов

15.08.2019, 18:21. Показов 7179. Ответов 10
Метки нет (Все метки)

Как работает подключение заголовчных файлов в Линукс во время компиляции?
К примеру имею свой собственный заголовочный файл test.h и подключил его в main.cpp
C++
1
#include "test.h"
, теперь чтобы скомпилировать код я должен указать в команде какой файл я использую g++ test.h test.cpp main.cpp -o test ,
но если я подключу к примеру #include <iostream> то уже не должен буду указывать в команде ничего, или если к примеру я подключу #include <pthread.h> то должен буду указать в команде -pthread ,почему так ?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.08.2019, 18:21
Ответы с готовыми решениями:

Подключение заголовочных файлов
Имею два файла Large Factorial.h #include &lt;sstream&gt; #include &lt;iostream&gt; #include &lt;iomanip&gt;...

Подключение заголовочных файлов
Здравствуйте! Подскажите, можно ли сделать так, чтобы при создании нового консольного проекта,...

Подключение заголовочных файлов
Начал изучать С++, скачал несколько книг и заметил что в одних при включении заголовочных файлов...

Подключение заголовочных файлов
Итересует меня вопрос : нужно ли при компиляции программ оставлять только нужные хэдеры ? т.е. их...

10
95 / 81 / 22
Регистрация: 19.10.2013
Сообщений: 485
15.08.2019, 18:45 2
И в линукс, и не в линукс компилятору нужно знать где лежат заголовочные файлы. Это определяется в переменной окружения INCLUDE / INCLUDEPATH / CPLUS_INCLUDE_PATH в зависимости от ОС.
Если в переменной окружения нет какого-то пути, то его можно добавить (не глобально, а только на момент текущей компиляции) через параметры компилятора опцией -I {путь_к_заголовкам}.

Вот тут заодно написано про отличия между #include <file> и #indlude "file": Search Path
0
49 / 34 / 9
Регистрация: 27.12.2017
Сообщений: 1,450
15.08.2019, 18:55  [ТС] 3
WxMaper, я знаю отличие и понимаю что нужно указать путь,вопрос в том почему при подключении к примеру <pthread.h> компилировать мы должны с параметром -pthread , не указывая пути к заголовочному файлу и почему при подключении к примеру <iostream> мы не должны указывать путь(я помню что препроцессор при подключении заголовочных файлов с <> ищет их где-то в месте стандартных директориях где эти хедеры должны находиться,тогда почему это не работает с pthread?)
0
95 / 81 / 22
Регистрация: 19.10.2013
Сообщений: 485
15.08.2019, 19:44 4
Цитата Сообщение от ReYalp Посмотреть сообщение
тогда почему это не работает с pthread?
Думаю ответ кроется в том, что помимо подключения заголовочного файла нужно подключить еще и библиотеку pthread (я про libpthread). Эта библиотека "не из std" и многопоточность можно организовать не только с её помощью. В ОС даже могут быть установлены разные версии этой библиотеки.

Опция всего лишь добавляет поддержку libpthread, без неё можно точно также собирать проекты, указав где искать функции этой библиотеки: g++ -L/usr/lib/x86_64-linux-gnu -lpthread ...
такой вызов укажет компилятору, что реализацию функций библиотеки pthread нужно брать из файла /usr/lib/x86_64-linux-gnu/libpthread.a

Тоже самое справедливо для любой другой подключаемой библиотеки, просто для них в компиляторе не предусмотрено специальных опций.
0
49 / 34 / 9
Регистрация: 27.12.2017
Сообщений: 1,450
15.08.2019, 20:01  [ТС] 5
WxMaper,
Цитата Сообщение от WxMaper Посмотреть сообщение
Опция всего лишь добавляет поддержку libpthread, без неё можно точно также собирать проекты, указав где искать функции этой библиотеки: g++ -L/usr/lib/x86_64-linux-gnu -lpthread ...
не работает и почему у меня в системе есть вообще и libpthread.a и pthread.h?

Добавлено через 2 минуты
g++ -L/usr/lib/x86_64-linux-gnu -lpthread test1.h test1.cpp test.cpp -o test
вот как вписывал.

Добавлено через 30 секунд
ошибки undefined references
0
95 / 81 / 22
Регистрация: 19.10.2013
Сообщений: 485
15.08.2019, 20:04 6
Цитата Сообщение от ReYalp Посмотреть сообщение
вот как вписывал
А вы уверены что у вас libpthread лежит в /usr/lib/x86_64-linux-gnu? Это тоже от ОС зависит =)
Узнать можно командой find /usr/lib | grep pthread\.a

Вообще правильно писать так:
g++ test1.h test1.cpp test.cpp -o test -L/usr/lib/x86_64-linux-gnu -lpthread
0
49 / 34 / 9
Регистрация: 27.12.2017
Сообщений: 1,450
15.08.2019, 20:12  [ТС] 7
WxMaper, да,уверен

Добавлено через 3 минуты
WxMaper,
Цитата Сообщение от WxMaper Посмотреть сообщение
Вообще правильно писать так:
g++ test1.h test1.cpp test.cpp -o test -L/usr/lib/x86_64-linux-gnu -lpthread
так заработало,а какая разница вообще ,зачем тут указывать путь? можно же просто -lpthread
и все

Добавлено через 43 секунды
WxMaper, что делает команда -lpthread? в чем разница между -pthread и -lpthread?

Добавлено через 1 минуту
если она просто подключает библиотеку то отукда она знает где она находится? или это уже специально сделанная команда что-то типа скрипта?
0
49 / 34 / 9
Регистрация: 27.12.2017
Сообщений: 1,450
16.08.2019, 14:51  [ТС] 8
Although Pthreads is provided by glibc, it is in a separate library, libpthread, and thus
requires explicit linkage. With gcc, this is automated by the -pthread flag, which ensures
the proper library is linked into your executable:
gcc -Wall -Werror -pthread beard.c -o beard

вот ответ
0
3543 / 2214 / 401
Регистрация: 09.09.2017
Сообщений: 9,223
16.08.2019, 16:03 9
Лучший ответ Сообщение было отмечено ReYalp как решение

Решение

Цитата Сообщение от WxMaper Посмотреть сообщение
g++ test1.h test1.cpp test.cpp -o test -L/usr/lib/x86_64-linux-gnu -lpthread
Зачем вы передаете заголовочный файл компилятору?
Цитата Сообщение от ReYalp Посмотреть сообщение
так заработало,а какая разница вообще ,зачем тут указывать путь? можно же просто -lpthread
команда -l подключает библиотеку из стандартного пути. Команда -L добавляет еще один путь к "стандартным" чтобы команда -l искала еще и там.
Цитата Сообщение от ReYalp Посмотреть сообщение
что делает команда -lpthread? в чем разница между -pthread и -lpthread?
-l<lib> подключает библиотеку lib<lib>.a. Соответственно, -l pthread подключает libpthread.a. Что делает -pthread и делает ли что-нибудь я с ходу не знаю.
0
49 / 34 / 9
Регистрация: 27.12.2017
Сообщений: 1,450
16.08.2019, 17:11  [ТС] 10
COKPOWEHEU,
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Зачем вы передаете заголовочный файл компилятору?
чисто наугад добавил т.к. не знал как компилировать правильно с заголовочными файлами,
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
то делает -pthread и делает ли что-нибудь я с ходу не знаю.
Выше описано что
Цитата Сообщение от ReYalp Посмотреть сообщение
With gcc, this is automated by the -pthread flag, which ensures
the proper library is linked into your executable
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
команда -l подключает библиотеку из стандартного пути. Команда -L добавляет еще один путь к "стандартным" чтобы команда -l искала еще и там.
спасибо,полезная информация,
Насколько я понял то -pthread и -l pthread одно и то же

Добавлено через 37 минут
COKPOWEHEU, а может быть случай когда к примеру h и cpp файлы которые я подключаю находятся не в папке проэкта? Что делать в таком случае?
0
3543 / 2214 / 401
Регистрация: 09.09.2017
Сообщений: 9,223
17.08.2019, 01:31 11
Цитата Сообщение от ReYalp Посмотреть сообщение
чисто наугад добавил т.к. не знал как компилировать правильно с заголовочными файлами,
Заголовочные файлы обрабатываются только как часть исходников. То есть упоминание в коде #include "test1.h" уже дает компилятору понять, что будет использоваться соответствующий файл, других подсказок ему не надо.
Хоть везде это и рассказывается, на всякий случай повторю: директива #include - команда компилятору (точнее - препроцессору) вставить вместо себя содержимое файла. К примеру, возможно вот такое извращение:
ext_arr.h
C
1
1,2,3,4,5
main.c
C
1
2
3
4
5
6
#include <stdio.h>
int nums[] = {
#include "ext_arr.h"
};
int main(){
}
Еще раз повторю: это извращение и делать так не надо. Но такой пример хорошо показывает механизм работы #include. Еще о разнице между <> и "": первый вариант говорит компилятору искать заголовок по стандартным путям, то есть там, где лежат системные заголовочные файлы. Второй вариант говорит искать рядом с текущим файлом *.c/*.cpp. Причем путь к файлу это именно путь, а не только имя. Скажем, если у вас исходники лежат в папке src, заголовки в inc, то вполне можно записать и так: #include "../inc/file.h".
Цитата Сообщение от ReYalp Посмотреть сообщение
COKPOWEHEU, а может быть случай когда к примеру h и cpp файлы которые я подключаю находятся не в папке проэкта? Что делать в таком случае?
Если по-хорошему, то стоит делать именно как проект. То есть если используете среду разработки (IDE) то искать где в ней прописывается. Если нет, изучать make и настраивать там. На первых порах сойдет и способ, описанный выше. Но если такая проблема уже возникла, велика вероятность, что дальше будет только хуже: больше файлов, хитрее иерархия, и все равно придете к раздельной компиляции и тому же make'у (или cmake, или qmake или что-то подобное).
2
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.08.2019, 01:31
Помогаю со студенческими работами здесь

Подключение заголовочных файлов.
У меня есть заголовочный файл: ...\1\2\file.h. в папке &quot;1&quot; есть file2.h. Как подключить к &quot;file.h&quot;...

Подключение заголовочных файлов
Здравствуйте. Возникают ошибки при компиляции проекта: 1. Указывает на указатель: 2. Указывает...

Правильное подключение заголовочных файлов
Как подключать заголовочные файлы я знаю, но вот у меня есть вопрос, ответ на который я нигде не...

Правильное подключение заголовочных файлов
Всем привет!!!Начал разбираться с ООП , и ... тут же возникла проблема. Пишу программу следующую ...

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

Перекрёстное подключение заголовочных файлов
Здоровеньки булы. Есть 2 класса, каждый в своём хедере. В классе А есть экземпляр (не указатель)...


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

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

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