Как сделать новые файлы заголовков доступными повсеместно?

Я только что загрузил несколько новых файлов заголовков и имею папку из них, которую я хочу сделать доступной. Во-первых, я хотел бы сделать их доступными для любых файлов, желающих их использовать. Поэтому я хотел бы включить новый заголовочный файл (назовите его newheader.h), где я хочу, например, как math.h. Где я должен это поставить?

Во-вторых, я хочу сделать эти файлы доступными для всех пользователей. У меня есть права root. Есть ли специальный каталог, в который мне нужно его поместить? Большое спасибо!

4
задан 19 March 2018 в 05:28

8 ответов

Вопрос в том, чего вы хотите достичь?

Обычно у вас есть три сценария:

разработка локальной установки (в вашей $HOME) глобальной установке

Для первых 2 вы, вероятно, должны использовать переключатель -I, чтобы указать путь к заголовкам. Первый, вероятно, будет -I../mylib/include, второй может быть -I/home/user/local_libs/somelib/include.

Третья - глобальная установка, которая должна размещать их в /usr/local/include, но управляться с помощью инструмента, такого как automake или cmake. [Info]

При использовании automake у вас могут появляться уведомления, чем параметр --prefix по умолчанию /usr/local для безопасная установка, которая не мешает системным пакетам, в то время как поддерживающие debian работают ./configure --prefix=/usr в своих сценариях пакетов. Путь включения построен из этого префикса, поэтому он следует за установкой пакета.

1
ответ дан 17 July 2018 в 18:33

Сохраните их в папке /usr/local/include. Из http://tldp.org/LDP/Linux-Filesystem-Hierarchy/html/usr.html в этом каталоге элементы «... не могут быть перезаписаны при обновлении системного программного обеспечения», что важно, поскольку вы делаете не хотите, чтобы файлы заголовков, которые вы загрузили, были сбиты с помощью системных обновлений, что может произойти, если вы поместите их в /usr/include.

9
ответ дан 17 July 2018 в 18:33

В моей системе каталог /usr/local/include/ существует и пуст. В стандарте Filsystem Hierarchy Standard (FHS 3.0) используется каталог /usr/local/include. Файлы должны быть читаемыми по всему миру (0444), а каталоги должны быть доступны для поиска (0555).

6
ответ дан 17 July 2018 в 18:33

Имитация (но не дублирование) имен каталогов

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

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

$ `gcc -print-prog-name=cc1plus` -v ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/5/../../../../x86_64-linux-gnu/include" #include "..." search starts here: #include <...> search starts here: /usr/include/c++/5 /usr/include/x86_64-linux-gnu/c++/5 /usr/include/c++/5/backward /usr/lib/gcc/x86_64-linux-gnu/5/include /usr/local/include /usr/lib/gcc/x86_64-linux-gnu/5/include-fixed /usr/include End of search list.

У меня нет специальных библиотек C или заголовков, установленных в моей системе, поэтому каждый должен иметь возможность реплицировать этот поиск «из коробки».

Когда вы переходите к: /usr/include/x86_64-linux-gnu/c++/5, вы видите, что заголовочные файлы включены в программы C. Поэтому нет жесткого и правильного правила, что заголовки должны быть в их собственном каталоге.

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

Где теперь хранятся файлы заголовков

Проверить, где хранятся файлы заголовков:

$ locate *version.h* /lib/firmware/carl9170fw/include/shared/version.h /usr/include/linux/version.h /usr/include/linux/dvb/version.h /usr/include/x86_64-linux-gnu/gnu/libc-version.h /usr/lib/python3/dist-packages/lxml/includes/lxml-version.h /usr/lib/x86_64-linux-gnu/perl/5.22.1/CORE/git_version.h /usr/src/linux-headers-3.16.53-031653/include/uapi/linux/dvb/version.h /usr/src/linux-headers-3.16.53-031653/include/xen/interface/version.h /usr/src/linux-headers-3.16.53-031653-generic/include/config/localversion.h /usr/src/linux-headers-3.16.53-031653-generic/include/config/arch/want/compat/ipc/parse/version.h /usr/src/linux-headers-3.16.53-031653-generic/include/config/isdn/diversion.h /usr/src/linux-headers-3.16.53-031653-generic/include/generated/uapi/linux/version.h /usr/src/linux-headers-4.10.0-28/include/uapi/linux/dvb/version.h /usr/src/linux-headers-4.10.0-28/include/xen/interface/version.h /usr/src/linux-headers-4.10.0-28-generic/include/config/localversion.h /usr/src/linux-headers-4.10.0-28-generic/include/config/arch/want/compat/ipc/parse/version.h /usr/src/linux-headers-4.10.0-28-generic/include/config/isdn/diversion.h /usr/src/linux-headers-4.10.0-28-generic/include/generated/uapi/linux/version.h

Это только верх моего списка.

Основываясь на существующих местоположениях заголовков, я бы склонен создавать каталог:

/usr/include/ourcompany/

для хранения всех файлов заголовков (.h).

Рассмотрим путь поиска по умолчанию

Однако, как указывали другие, популярное местоположение:

/usr/local/include/

В этой статье, написанной Ричардом Столлманом и другими, они пишут:

По умолчанию gcc ищет следующие каталоги для файлов заголовков:

/usr/local/include/ /usr/include/

и следующие каталоги для библиотек:

/usr/local/lib/ /usr/lib/
-2
ответ дан 17 July 2018 в 18:33

Вопрос в том, чего вы хотите достичь?

Обычно у вас есть три сценария:

разработка локальной установки (в вашей $HOME) глобальной установке

Для первых 2 вы, вероятно, должны использовать переключатель -I, чтобы указать путь к заголовкам. Первый, вероятно, будет -I../mylib/include, второй может быть -I/home/user/local_libs/somelib/include.

Третья - глобальная установка, которая должна размещать их в /usr/local/include, но управляться с помощью инструмента, такого как automake или cmake. [Info]

При использовании automake у вас могут появляться уведомления, чем параметр --prefix по умолчанию /usr/local для безопасная установка, которая не мешает системным пакетам, в то время как поддерживающие debian работают ./configure --prefix=/usr в своих сценариях пакетов. Путь включения построен из этого префикса, поэтому он следует за установкой пакета.

1
ответ дан 23 July 2018 в 19:21
  • 1
    Вопрос подразумевает глобальную доступность, поэтому я думаю, что здесь применим только ваш третий вариант. – Luke Salamone 19 March 2018 в 19:28
  • 2
    Я просто не уверен, если ваши собственные заголовки для чего-то, что находится в разработке и не развернуты как используемая библиотека, должны быть там или, например, в /opt/our-dev-code/include или копии для каждого пользователя. Поэтому у меня все еще есть ощущение, что это проблема X Y, и правильная опция -I - лучший ответ, а затем развертывание в /usr/local/include, поэтому я немного поработал над другими вариантами. – allo 19 March 2018 в 19:45
  • 3
    Хорошо указывать фазу развития и библиотеки производства. Возможно, также будет выпуск тестовой библиотеки. – WinEunuuchs2Unix 20 March 2018 в 01:50

Сохраните их в папке /usr/local/include. Из http://tldp.org/LDP/Linux-Filesystem-Hierarchy/html/usr.html в этом каталоге элементы «... не могут быть перезаписаны при обновлении системного программного обеспечения», что важно, поскольку вы делаете не хотите, чтобы файлы заголовков, которые вы загрузили, были сбиты с помощью системных обновлений, что может произойти, если вы поместите их в /usr/include.

9
ответ дан 23 July 2018 в 19:21
  • 1
    Должен ли я включать весь путь? Возможно ли это сделать так, что мне просто нужно написать #include & quot; cuba.h & quot; или #include & lt; cuba.h & gt; в верхней части файла C? – paulinho 19 March 2018 в 05:04
  • 2
    @paulinho Если вы, но cuba.h in in /usr/local/include, используйте #include <cuba.h>. Если вы положили foo/cuba.h в /usr/local/include, используйте #include <foo/cuba.h>. – muru 19 March 2018 в 05:27
  • 3
    Вы можете убедиться, что /usr/local/include сам находится в пути включения GCC по умолчанию, используя (например) gcc -v -xc -E /dev/null 2>&1 | awk '/#include/,/End/' – steeldriver 19 March 2018 в 06:00

В моей системе каталог /usr/local/include/ существует и пуст. В стандарте Filsystem Hierarchy Standard (FHS 3.0) используется каталог /usr/local/include. Файлы должны быть читаемыми по всему миру (0444), а каталоги должны быть доступны для поиска (0555).

6
ответ дан 23 July 2018 в 19:21
  • 1
    Для каталога вполне разумно существовать и быть пустым - вы просто еще не добавили файлы. Весь смысл этого каталога заключается в том, что его содержимое варьируется между системами. – MSalters 19 March 2018 в 18:47

Имитация (но не дублирование) имен каталогов

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

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

$ `gcc -print-prog-name=cc1plus` -v ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/5/../../../../x86_64-linux-gnu/include" #include "..." search starts here: #include <...> search starts here: /usr/include/c++/5 /usr/include/x86_64-linux-gnu/c++/5 /usr/include/c++/5/backward /usr/lib/gcc/x86_64-linux-gnu/5/include /usr/local/include /usr/lib/gcc/x86_64-linux-gnu/5/include-fixed /usr/include End of search list.

У меня нет специальных библиотек C или заголовков, установленных в моей системе, поэтому каждый должен иметь возможность реплицировать этот поиск «из коробки».

Когда вы переходите к: /usr/include/x86_64-linux-gnu/c++/5, вы видите, что заголовочные файлы включены в программы C. Поэтому нет жесткого и правильного правила, что заголовки должны быть в их собственном каталоге.

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

Где теперь хранятся файлы заголовков

Проверить, где хранятся файлы заголовков:

$ locate *version.h* /lib/firmware/carl9170fw/include/shared/version.h /usr/include/linux/version.h /usr/include/linux/dvb/version.h /usr/include/x86_64-linux-gnu/gnu/libc-version.h /usr/lib/python3/dist-packages/lxml/includes/lxml-version.h /usr/lib/x86_64-linux-gnu/perl/5.22.1/CORE/git_version.h /usr/src/linux-headers-3.16.53-031653/include/uapi/linux/dvb/version.h /usr/src/linux-headers-3.16.53-031653/include/xen/interface/version.h /usr/src/linux-headers-3.16.53-031653-generic/include/config/localversion.h /usr/src/linux-headers-3.16.53-031653-generic/include/config/arch/want/compat/ipc/parse/version.h /usr/src/linux-headers-3.16.53-031653-generic/include/config/isdn/diversion.h /usr/src/linux-headers-3.16.53-031653-generic/include/generated/uapi/linux/version.h /usr/src/linux-headers-4.10.0-28/include/uapi/linux/dvb/version.h /usr/src/linux-headers-4.10.0-28/include/xen/interface/version.h /usr/src/linux-headers-4.10.0-28-generic/include/config/localversion.h /usr/src/linux-headers-4.10.0-28-generic/include/config/arch/want/compat/ipc/parse/version.h /usr/src/linux-headers-4.10.0-28-generic/include/config/isdn/diversion.h /usr/src/linux-headers-4.10.0-28-generic/include/generated/uapi/linux/version.h

Это только верх моего списка.

Основываясь на существующих местоположениях заголовков, я бы склонен создавать каталог:

/usr/include/ourcompany/

для хранения всех файлов заголовков (.h).

Рассмотрим путь поиска по умолчанию

Однако, как указывали другие, популярное местоположение:

/usr/local/include/

В этой статье, написанной Ричардом Столлманом и другими, они пишут:

По умолчанию gcc ищет следующие каталоги для файлов заголовков:

/usr/local/include/ /usr/include/

и следующие каталоги для библиотек:

/usr/local/lib/ /usr/lib/
-2
ответ дан 23 July 2018 в 19:21
  • 1
    /usr/include не является местом для файлов с добавлением вручную, он должен быть зарезервирован для управляемых файлов. Вы никогда не знаете, когда пакет, который вы устанавливаете, может иметь заголовочный файл с тем же именем / структурой каталогов. – JAB 19 March 2018 в 04:34
  • 2
    @JAB Да, каждый пакет под солнцем создаст там подкаталог. Вот почему я выбрал «нашу компанию». как имя подкаталога, чтобы избежать дублирования. Ваша точка зрения хорошо взята, и я могу в конечном итоге удалить этот ответ во второй трезвой мысли. – WinEunuuchs2Unix 19 March 2018 в 04:40

Другие вопросы по тегам:

Похожие вопросы: