- [C-Linux] Где лежат самые кошерные заголовочные файлы
- Русские Блоги
- Путь поиска для заголовочных файлов и библиотек Linux
- 1.1 В какую папку устанавливаются библиотечные файлы .so и заголовочные файлы .h при установке glibc, как gcc может правильно найти соответствующие папки?
- 1.2 Каковы пути поиска библиотеки ссылок, когда программа связана?
- 1.3 Когда программа работает, каковы пути поиска в библиотеке динамических ссылок?
- 1.4. Каковы пути поиска заголовочных файлов при компиляции программы?
- 1.5. При настройке кросс-компилятора, каковы конфигурации пути поиска?
- 2. Пример операции
- 2.1, путь поиска библиотеки при связывании
- 2.2, место поиска библиотеки динамической загрузки во время выполнения
- 2.3 Каковы пути поиска заголовочных файлов при компиляции программы?
- Как я могу найти заголовочные файлы языка программирования C в Linux?
- ОТВЕТЫ
- Ответ 1
- Ответ 2
- Ответ 3
- Ответ 4
- Ответ 5
- Ответ 6
- Ответ 7
- Ответ 8
[C-Linux] Где лежат самые кошерные заголовочные файлы
Решил навести порядок в голове. Вот к примеру пользуюсь я функцией ioctl, мне нужна она сама, плюс дефайны соответствующих операций.
Теперь вопросы:
1. Какой каталог полнее?
2. Какой каталог использовать правильнее?
3. Нафига два каталога?
правильно использовать то что в мане написано.
А вот какого хрена всё именно так устроено (там куча других чудес) у меня тоже вызывает вопросы. Для меня всё это очень непрозрачно.
Если ты не строишь свой собственный дистрибутив, свой тулчейн, и не делаешь что-то странное, то надо использовать стандартные пути компилятора.
То есть то, что в /usr/include, то, что выдает pkg-config пакет —cflags, и тп. Руками в эту кухню чучше не лезть. Используй стандарты, man’ы и прочее. Если интересно, что использует компилятор, добавь -v в командную строку.
А вообще, то, что лежит в исходниках ядра и в так называемых «linux-headers» и тп — оно не предназначено для использования напрямую юзерспейсом, glibc при сборке там обработку делает, скрипты гоняет и генерит своих хедеров. То есть нужно использовать продукт обработки glibc и потом gcc, обычно сидящий в /usr/include.
в данном случае — «/usr/include/linux/fs.h» (
), т.к. это «первоисточник» константы BLKGETSIZE.
Тут нету кошерных заголовочных файлов. Это линукс.
Предлагаешь самому объявлять константы и прототипы?
Я предлагаю открыть мануал и подключить sys/ioctl.h
Тут нету кошерных заголовочных файлов. Это линукс.
Это по твоему кошерно? Линукс по сравнении с этим безумием — идеален
Источник
Русские Блоги
Путь поиска для заголовочных файлов и библиотек Linux
Эта статья перенесена с: https://blog.csdn.net/pwl999/article/details/78219374
1.1 В какую папку устанавливаются библиотечные файлы .so и заголовочные файлы .h при установке glibc, как gcc может правильно найти соответствующие папки?
Когда мы устанавливаем –prefix = / path / при сборке gcc, gcc устанавливается в / path /. По умолчанию gcc будет искать библиотеки в / path / lib / и искать файлы заголовков в / path / include /.
Например, в обычных системах Linux и gcc, и glibc установлены в каталоге / usr /, поэтому исполняемый файл gcc находится в каталоге / usr / bin, а файл библиотеки glibc находится в / usr / lib В этом каталоге файл заголовка glibc находится в каталоге / usr / include.
Разумеется, указанное выше соотношение не является точным и может быть указано вручную при установке gcc и glibc. Вы можете использовать команду «gcc -print-search-dirs» для просмотра пути поиска библиотеки gcc:
Вы можете использовать следующие методы, чтобы изменить путь к библиотеке и файлу заголовка, который gcc ищет по умолчанию:
- (1) Используйте «gcc -nostdlib -Lusrlibpath», чтобы изменить путь поиска библиотеки по умолчанию для gcc, и используйте «gcc -nostdinc -Iusrincpath», чтобы изменить путь поиска заголовка по умолчанию для gcc.
- (2) Используйте «gcc -Wl, -sysroot =», чтобы изменить путь поиска библиотеки по умолчанию для gcc.
- (3) Измените файл спецификации gcc, чтобы настроить любые параметры gcc.
Спецификации — это файлы конфигурации gcc. Этот метод модификации является самым мощным, но он также является самым сложным и рискованным, поскольку файл спецификации gcc неясен и труден для понимания. Пока я не буду изменять его, но сначала я расскажу о существовании этого метода.
Используйте команду «gcc -v», чтобы просмотреть путь к спецификациям gcc:
В некоторых установках gcc используются встроенные спецификации, но нет внешних файлов спецификаций:
Для встроенной спецификации вы можете использовать команду «gcc -dumpspecs» для просмотра содержимого конкретной спецификации:
Вы также можете использовать «gcc -specs =», чтобы указать файл спецификации gcc.
- (4) Передается ли конфигурация gcc по умолчанию командой configure во время сборки?
Используйте команду «gcc -v» для просмотра значения конфигурации gcc. Параметры конфигурации описаны в файле gcc-4.1.0 \ gcc \ doc \ install.texi.
1.2 Каковы пути поиска библиотеки ссылок, когда программа связана?
При связывании конфигурация пути поиска библиотеки имеет следующие методы: (Для конкретного использования, пожалуйста, обратитесь к описанию в главе примера)
- (1) Используйте «gcc -Llibpath -llibname», чтобы указать путь поиска библиотеки ссылок.
- (2) Используйте переменную среды «LIBRARY_PATH», чтобы указать путь поиска библиотеки ссылок.
- (3) Используйте «SEARCH_DIR» в сценарии подключения ld, чтобы указать путь поиска библиотеки ссылок.
1.3 Когда программа работает, каковы пути поиска в библиотеке динамических ссылок?
При связывании конфигурация пути поиска библиотеки имеет следующие методы: (Для конкретного использования, пожалуйста, обратитесь к описанию в главе примера)
- (1) При компиляции используйте «gcc -Wl, -rpath», чтобы указать путь поиска библиотеки динамических ссылок во время выполнения, и жестко запишите его в опцию «RPATH» файла ELF.
- (2) Переменная среды «LD_RUN_PATH» используется для указания пути поиска библиотеки динамических ссылок во время компиляции, и она жестко задана в опции «RPATH» файла ELF.
- (3) Используйте переменную среды «LD_LIBRARY_PATH», чтобы указать путь поиска библиотеки динамических ссылок во время выполнения.
- (4) Используйте файл конфигурации «/etc/ld.so.conf», чтобы указать путь поиска библиотеки динамических ссылок во время выполнения.
- (5) Используйте путь поиска по умолчанию «/ lib, / usr / lib» библиотеки динамических ссылок во время выполнения.
1.4. Каковы пути поиска заголовочных файлов при компиляции программы?
При компиляции конфигурация пути поиска файла заголовка имеет следующие методы: (Для конкретного использования, пожалуйста, обратитесь к описанию в главе примера)
- (1) Используйте «gcc -I incpath», чтобы указать путь поиска файла заголовка во время компиляции.
- (2) Используйте переменную окружения «C_INCLUDE_PATH», чтобы указать путь поиска файла заголовка во время компиляции.
- (3) Использовать путь поиска заголовка gcc по умолчанию при компиляции.
Описание общих каталогов заголовочных файлов:
/ usr / src / linux / — это путь к исходному коду ядра, а / usr / src / linux / include содержит заголовочный файл ядра, который обычно используется при компиляции модуля.
Путь / usr / include — это в основном заголовочный файл glibc, который используется для компиляции файлов пользовательского режима. Однако / usr / include также содержит папки linux / и asm /, необходимые для заголовочных файлов ядра, но эти две папки в основном используются для совместимости, а / usr все еще используется для заголовочных файлов ядра. / SRC / Linux / включить.
1.5. При настройке кросс-компилятора, каковы конфигурации пути поиска?
При создании кросс-компилятора необходимо обратить внимание на конфигурацию четырех связанных путей: путь файла библиотеки, связанный во время компиляции, путь файла заголовка, используемого во время компиляции, путь двоичного инструмента, используемого во время компиляции, и имя динамического загрузчика, указанного во время компиляции путь.
- (1) Путь к файлу библиотеки, связанному во время компиляции:
Если не указан, это должен быть путь по умолчанию, связанный с путем установки. Если вы хотите указать, вы можете использовать опцию «LIB_PATH» при компиляции ld в binutils:
- (2) Путь к заголовочному файлу, используемому во время компиляции:
- (3) Бинарный путь инструмента, используемый во время компиляции:
Путь двоичного инструмента по умолчанию можно просмотреть с помощью следующей команды:
Используя указанный двоичный инструмент, вы можете использовать опцию «gcc -B»:
- (4) Путь и имя динамического загрузчика, указанного во время компиляции:
Путь и имя динамического загрузчика, жестко запрограммированного в elf, указанного в файле спецификации gcc:
2. Пример операции
Создайте два .c файла:
2.1, путь поиска библиотеки при связывании
Скомпилируйте say.c в libsay.so, а затем скомпилируйте libsay.so при компиляции test.c, чтобы проверить путь поиска в библиотеке, когда gcc связан.
- (1) Используйте «gcc -Llibpath -llibname», чтобы указать путь поиска библиотеки ссылок:
(2) Используйте переменную среды «LIBRARY_PATH», чтобы указать путь поиска библиотеки ссылок:
(3) Используйте «SEARCH_DIR» в сценарии подключения ld, чтобы указать путь поиска библиотеки ссылок:
Используйте команду «ld -verbose», чтобы просмотреть параметр SEARCH_DIR в скрипте ссылок gcc по умолчанию. Конечно, вы также можете использовать «ld -Txxx.lds», чтобы указать скрипт связи.
Скопируйте libsay.so в указанный путь SEARCH_DIR и свяжите тест:
2.2, место поиска библиотеки динамической загрузки во время выполнения
- (1) Используйте «gcc -Wl, -rpath», чтобы указать путь поиска библиотеки динамических ссылок во время выполнения, и жестко закодируйте в ELF-файл параметр «RPATH»:
Используйте файл readelf для просмотра жестко заданного пути поиска библиотеки времени выполнения в файле elf:
- (2) Используйте переменную среды «LD_RUN_PATH», чтобы указать путь поиска библиотеки динамических ссылок во время компиляции, и жестко запишите ее в опцию «RPATH» файла ELF:
- (3) Используйте переменную среды «LD_LIBRARY_PATH», чтобы указать путь поиска библиотеки динамических ссылок во время выполнения:
(4) Используйте файл конфигурации «/etc/ld.so.conf», чтобы указать путь поиска библиотеки динамических ссылок во время выполнения:
(5) Используйте путь поиска по умолчанию «/ lib, / usr / lib» библиотеки динамических ссылок во время выполнения:
Создайте файл .c и файл .h:
2.3 Каковы пути поиска заголовочных файлов при компиляции программы?
(1) Используйте «gcc -I incpath», чтобы указать путь поиска файла заголовка во время компиляции:
(2) Используйте переменную окружения «C_INCLUDE_PATH», чтобы указать путь поиска файла заголовка во время компиляции:
- (3) Использовать путь поиска заголовка gcc по умолчанию при компиляции:
Метод настройки пути поиска файла заголовка Gcc по умолчанию не уточнен. Но вы можете использовать следующую команду для просмотра:
Используйте путь по умолчанию для компиляции:
Источник
Как я могу найти заголовочные файлы языка программирования C в Linux?
Когда я пишу программы C в Linux, а затем компилирую их с помощью gcc, мне всегда интересно, где эти файлы заголовков. Например, где stdio.h . В более общем плане, где stdbool.h ?
То, что я хочу знать, не только там, где оно есть, но и как получить эти места, например, используя команду оболочки или используя язык программирования C.
ОТВЕТЫ
Ответ 1
gcc -H . будет печатать полный путь каждого включаемого файла в качестве побочного эффекта обычной компиляции. Используйте -fsyntax-only в дополнение к тому, чтобы не создавать какой-либо вывод (он все равно скажет вам, есть ли в вашей программе ошибки). Пример (Linux, gcc-4.7):
Точки в начале каждой строки подсчитывают, насколько глубоко вложен #include .
Ответ 2
Если вы используете gcc, вы можете проверить конкретный файл с чем-то вроде:
-H просит препроцессор рекурсивно печатать все включенные файлы. head -n1 берет только первую строку вывода из этого, чтобы игнорировать любые файлы, включенные именованным заголовком (хотя, вероятно, stdbool.h, вероятно, не работает).
На моем компьютере, например, выходы выше:
Ответ 3
но locate полагается на базу данных, если вы ее никогда не обновляли
вы также можете запросить gcc , чтобы узнать, какие каталоги по умолчанию сканируются самим gcc :
Ответ 4
Во время предварительной обработки все директивы препроцессора будут заменены действиями. Как расширение макросов, удаление комментариев кода, включая исходный код заголовка и т.д.
мы можем проверить его, используя команду «CPP» — C PreProcessor.
Например, в командной строке
Он отобразит предварительно обработанный вывод.
Ответ 5
Один подход, если вы знаете имя файла include, будет использовать find:
Это займет некоторое время, когда оно проходит через все каталоги.
Ответ 6
Используйте gcc -v , и вы можете проверить путь включения. Обычно включенные файлы находятся в /usr/include или /usr/local/include в зависимости от установки библиотеки.
Ответ 7
Большинство стандартных заголовков хранятся в /usr/include . Похоже, что stdbool.h хранится где-то в другом месте и зависит от того, какой компилятор вы используете. Например, g++ хранит его в /usr/include/c++/4.7.2/tr1/stdbool.h , тогда как clang хранит его в /usr/lib/clang/3.1/include/stdbool.h .
Ответ 8
Я думаю, что общий путь:
/usr/lib/gcc/$(ls/usr/lib/gcc/)/$(gcc -v 2 > & 1 | tail -1 | awk ‘
Источник