Como posso descobrir quais sinalizadores de linker são necessários para usar uma determinada função da biblioteca C?

2

A execução do código C é um exercício doloroso, a menos que seja fornecido com um makefile.

Eu sempre me encontro com um arquivo C contendo código que supostamente faz algo muito legal, mas para o qual uma primeira tentativa básica de compilação ( gcc main.c ) falha com -

main.c:(.text+0x1f): undefined reference to 'XListInputDevices'
clang-3.7: error: linker command failed with exit code 1 (use -v to see invocation)

ou similar.

Sei que isso significa que estou perdendo os sinalizadores de vinculador corretos, como -lX11 , -lXext ou -lpthread .

Mas quais?

A forma como lidei com isso é encontrar o cabeçalho da biblioteca que uma função foi incluída , use a pesquisa do Github para encontrar algum outro programa que importe o mesmo cabeçalho, abra seu makefile, encontre os sinalizadores de linker, copie-os no comando de compilação e continue apagando bandeiras até encontrar um conjunto mínimo que ainda compila.

Isso é ineficiente, chato e me faz sentir como deve haver uma maneira melhor.

    
por Anko 20.04.2016 / 17:27

2 respostas

4

A questão é como determinar qual sinalizador de linker usar a partir da inspeção do arquivo de origem. O exemplo abaixo irá funcionar para o Debian. Os arquivos de cabeçalho são os itens relevantes a serem observados aqui.

Então, suponha que alguém tenha um arquivo fonte em C contendo o cabeçalho

#include <X11/extensions/XInput.h>.

Podemos fazer uma pesquisa por XInput.h usando, digamos, apt-file . Se você souber que esse arquivo de cabeçalho está contido em um pacote instalado, dpkg -S ou dlocate também funcionará. Por exemplo,

apt-file search XInput.h
libxi-dev: /usr/include/X11/extensions/XInput.h

Isso informa que esse arquivo de cabeçalho pertence ao pacote de desenvolvimento para libxi (para bibliotecas C, os pacotes de desenvolvimento (normalmente no formato libname-dev ou libname-devel ) contêm os arquivos de cabeçalho) e, portanto, você deve usar o -lxi flag de vinculador.

Métodos similares devem funcionar para qualquer distribuição com um sistema de gerenciamento de pacotes.

    
por 20.04.2016 / 18:49
1

Aqui está um wiki da comunidade para coletar as ferramentas equivalentes de outras distros para o método de Faheem . Sinta-se à vontade para editar, mas mantenha a ordem alfabética para pesquisar.

Arco

Use pkgfile do repositório extra , passando o nome do arquivo de cabeçalho como um parâmetro.

Exemplo:

$ pkgfile XInput.h
extra/libxi
extra/nx-headers

Debian

(e qualquer coisa baseada no Debian usando dpkg )

apt-file search para o nome do arquivo de cabeçalho, conforme .

Gentoo

Conforme abordado em outra pergunta por warl0ck , use o programa pfl do e-file package ou, como alternativa, , a pesquisa da Lista de arquivos do Portage baseada na Web .

    
por 13.04.2017 / 14:36