Como disponibilizar universalmente novos arquivos de cabeçalho?

4

Acabei de baixar alguns novos arquivos de cabeçalho e tenho uma pasta deles que desejo disponibilizar. Primeiro, gostaria de disponibilizá-los para qualquer arquivo que deseje usá-los. Então, eu gostaria de poder incluir o novo arquivo de cabeçalho (chame-o newheader.h) onde eu quero, assim como math.h, por exemplo. Onde devo colocar isso?

Em segundo lugar, desejo disponibilizar esses arquivos para todos os usuários. Eu tenho permissões de root. Existe um diretório especial que eu preciso colocar? Muito obrigado!

    
por paulinho 19.03.2018 / 00:36

4 respostas

9

Armazene-os em /usr/local/include . A partir do link , os itens neste diretório são "... seguros de serem sobrescritos quando o o software do sistema é atualizado ", o que é importante, pois você não deseja que os arquivos de cabeçalhos que você baixou sejam burlados por atualizações do sistema, o que pode acontecer se você os colocar em /usr/include .

    
por dsstorefile1 19.03.2018 / 00:47
6

No meu sistema, o diretório /usr/local/include/ existe e está vazio. O Padrão de Hierarquia Filsystem diz ( FHS 3.0 ) que o diretório a usar é /usr/local/include . Os arquivos devem ser legíveis por todo o mundo ( 0444 ) e os diretórios devem ser pesquisáveis ( 0555 ).

    
por waltinator 19.03.2018 / 00:49
1

A pergunta é: o que você quer alcançar?

Normalmente você tem três cenários:

  • desenvolvimento
  • instalação local (no seu $HOME )
  • instalação global

Para os dois primeiros, você provavelmente deve usar a opção -I para fornecer um caminho para os cabeçalhos. O primeiro provavelmente seria -I../mylib/include , o segundo pode ser -I/home/user/local_libs/somelib/include .

O terceiro é uma instalação global, que deve colocá-los em /usr/local/include , mas gerenciada por uma ferramenta como automake ou cmake. Ao empacotar, o mantenedor deve adaptar o caminho de instalação e / ou o caminho de inclusão para instalar os cabeçalhos em /usr/include .

Ao usar o automake, você pode ter avisos do que o parâmetro --prefix padroniza para /usr/local para uma instalação segura que não interfira com os pacotes do sistema, enquanto que os mantenedores do debian executam ./configure --prefix=/usr em seus scripts de pacotes. O caminho de inclusão é construído a partir desse prefixo, então segue a instalação do pacote.

    
por allo 19.03.2018 / 14:13
-2

Imitando (mas não duplicando) nomes de diretório

Geralmente não codificamos no vácuo e o que escrevemos é baseado no que os outros escreveram antes de nós. Supondo que seus programas em C e os arquivos de cabeçalho ( .h ) sejam construídos sobre outro sistema de software, então você deve modelar sua estrutura de diretórios após a deles.

Como não tenho ideia do seu ambiente, vamos pegar um programa comum e ver qual estrutura de diretórios eles usaram para os arquivos de cabeçalho:

$ '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.

Não tenho bibliotecas C ou de cabeçalhos especiais instaladas em meu sistema para que todos possam replicar essa pesquisa "fora da caixa".

Quando você detalha: /usr/include/x86_64-linux-gnu/c++/5 , percebe que os arquivos de cabeçalho estão incluídos nos programas em C. Portanto, não há regra rígida e rápida de que os cabeçalhos precisam estar em seu próprio diretório.

Quando se trata de programação, você pode colocar arquivos em qualquer lugar que quiser e chamá-los como quiser. É claro que o que você decidir, deve fazer sentido para você e seus colegas de trabalho.

Onde os arquivos de cabeçalho são armazenados agora

Verifique onde os arquivos de cabeçalho estão armazenados agora:

$ 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

Este é apenas o topo da minha listagem. Continua extensivamente.

Com base nos locais de arquivo de cabeçalho existentes, eu estaria inclinado a criar o diretório:

/usr/include/ourcompany/

para armazenar todos os arquivos de cabeçalho ( .h ).

Considere o caminho de pesquisa padrão

No entanto, como outros apontaram uma localização popular é:

/usr/local/include/

Em este artigo escrito por Richard Stallman e outros, eles escrevem:

Por padrão, o gcc procura nos seguintes diretórios por arquivos de cabeçalho:

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

e os seguintes diretórios para bibliotecas:

/usr/local/lib/
/usr/lib/
    
por WinEunuuchs2Unix 19.03.2018 / 00:45