49 / 34 / 9
Регистрация: 27.12.2017
Сообщений: 1,450
|
||||||
1 | ||||||
Подключение заголовочных файлов15.08.2019, 18:21. Показов 7179. Ответов 10
Метки нет Все метки)
(
Как работает подключение заголовчных файлов в Линукс во время компиляции?
К примеру имею свой собственный заголовочный файл test.h и подключил его в main.cpp
но если я подключу к примеру #include <iostream> то уже не должен буду указывать в команде ничего, или если к примеру я подключу #include <pthread.h> то должен буду указать в команде -pthread ,почему так ?
0
|
|
15.08.2019, 18:21 | |
Ответы с готовыми решениями:
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 |
Думаю ответ кроется в том, что помимо подключения заголовочного файла нужно подключить еще и библиотеку 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,
не работает и почему у меня в системе есть вообще и 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 |
А вы уверены что у вас 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, так заработало,а какая разница вообще ,зачем тут указывать путь? можно же просто -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 |
![]() Решение
Зачем вы передаете заголовочный файл компилятору?
команда -l подключает библиотеку из стандартного пути. Команда -L добавляет еще один путь к "стандартным" чтобы команда -l искала еще и там.-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,
чисто наугад добавил т.к. не знал как компилировать правильно с заголовочными файлами,
Выше описано что спасибо,полезная информация, Насколько я понял то -pthread и -l pthread одно и то же Добавлено через 37 минут COKPOWEHEU, а может быть случай когда к примеру h и cpp файлы которые я подключаю находятся не в папке проэкта? Что делать в таком случае?
0
|
3543 / 2214 / 401
Регистрация: 09.09.2017
Сообщений: 9,223
|
|||||||||||
17.08.2019, 01:31 | 11 | ||||||||||
Заголовочные файлы обрабатываются только как часть исходников. То есть упоминание в коде
#include "test1.h" уже дает компилятору понять, что будет использоваться соответствующий файл, других подсказок ему не надо.Хоть везде это и рассказывается, на всякий случай повторю: директива #include - команда компилятору (точнее - препроцессору) вставить вместо себя содержимое файла. К примеру, возможно вот такое извращение:ext_arr.h
main.c
#include . Еще о разнице между <> и "" : первый вариант говорит компилятору искать заголовок по стандартным путям, то есть там, где лежат системные заголовочные файлы. Второй вариант говорит искать рядом с текущим файлом *.c/*.cpp. Причем путь к файлу это именно путь, а не только имя. Скажем, если у вас исходники лежат в папке src, заголовки в inc, то вполне можно записать и так: #include "../inc/file.h" .Если по-хорошему, то стоит делать именно как проект. То есть если используете среду разработки (IDE) то искать где в ней прописывается. Если нет, изучать make и настраивать там. На первых порах сойдет и способ, описанный выше. Но если такая проблема уже возникла, велика вероятность, что дальше будет только хуже: больше файлов, хитрее иерархия, и все равно придете к раздельной компиляции и тому же make'у (или cmake, или qmake или что-то подобное).
2
|
17.08.2019, 01:31 | |
Помогаю со студенческими работами здесь
11
Подключение заголовочных файлов. Подключение заголовочных файлов
Перекрестное подключение заголовочных файлов Перекрёстное подключение заголовочных файлов Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |