algo está terrivelmente errado com o pkg-config

5

Eu tenho tido um tempo angustiante ultimamente tentando obter vários programas em C compilados porque não consigo encontrar onde as bibliotecas estão localizadas e o pkg-config parece estar fora de ordem.

Eu instalei o GNU GSL assim:

wget ftp://ftp.gnu.org/gnu/gsl/gsl-1.15.tar.gz
tar xvzf gsl-*gz
cd gsl-1.15
./configure
make
sudo make install

Aparentemente, instalou em /usr/local/lib , que é um local não padrão? (1) O que é um lugar padrão? (2) Como eu poderia instalá-lo lá?

E não consigo compilar um programa simples que usa essa biblioteca:

$ gcc gsl_erf.c -o gsl -I/usr/local/lib -L/usr/local/lib
/tmp/cc3WD9Zq.o: In function 'main':
gsl_erf.c:(.text+0x24): undefined reference to 'gsl_cdf_gaussian_P'
collect2: error: ld returned 1 exit status

Agora, com o pkg-config:

pkg-config --libs --cflags gslPackage gsl was not found in the pkg-config search path.
Perhaps you should add the directory containing 'gsl.pc'
to the PKG_CONFIG_PATH environment variable
No package 'gsl' found

Então, adicionei o diretório:

PKG_CONFIG_PATH=/usr/local/lib/pkgconfig

Mas sem sorte ainda! :( pkg-config ainda me dá a mesma mensagem acima. ( Perhaps you sh ... )

Este é um problema mais geral que enfrento regularmente quando tenho que compilar algum programa em C. Eu adoraria uma solução geral para:

  1. Onde e como instalo minhas libras C? (Talvez o mesmo lugar que você instala?)
  2. Como corrijo / configurei e uso o pkg-config

Atualizar : Eu tentei uma das sugestões da resposta abaixo e executar o programa compilado me fornece o seguinte: ./gsl_app: error while loading shared libraries: libgsl.so.0: cannot open shared object

    
por gideon 25.01.2014 / 08:55

2 respostas

9

Apparently it installed in /usr/local/lib which is a non-standard place?

É um local padrão, mas às vezes os sistemas são configurados presumindo que você não vai instalar nada, e por isso é deixado de fora do caminho do cache do vinculador.

Where and how do I install my C libs? (Perhaps the same place yum installs them?)

Isso geralmente é uma má ideia, esp. se houver pacotes de distribuição potencialmente - agora, ou abaixo da linha - que entrem em conflito. Fique com / usr / local.

Verifique se /usr/local/lib está em ld.so.cache executando ldconfig -v 2>&1 | grep /usr/local . Se você não obtiver nenhuma saída, crie um arquivo /etc/ld.so.conf.d/local.conf com uma linha:

/usr/local/lib

Execute essa ldconfig linha novamente e, desta vez, você deverá vê-la. Você precisa executar ldconfig toda vez que construir e instalar uma biblioteca a partir do código-fonte .

I can't manage to compile a simple program that uses this library

Porque você precisa passar os parâmetros pkg-config para o compilador. Primeiro, você precisa encontrar o gsl.pc real.

find /usr/local -name gsl.pc

Acho mais provável que seja em /usr/local/lib/pkgconfig e não em /usr/local/pkgconfig , como você diz. Experimente pkg-config --list-all | grep gsl e veja se ele foi encontrado. Se não for export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH (ou qualquer que seja o diretório com gsl.pc) e tente novamente. Quando você acertar, você pode querer adicioná-lo em algum lugar, por exemplo, /etc/profile.d .

Agora, para realmente compilar:

gcc gsl_erf.c -o gsl 'pkg-config --libs --cflags gsl'

Você não precisa incluir -I e -L você mesmo; é para isso que serve pkg-config , embora tudo o que você provavelmente estava faltando antes fosse -lgsl .

    
por 25.01.2014 / 11:43
0

Estou trabalhando no mesmo livro, 21st Century C, e tenho o mesmo problema. Eu encontrei a solução que me permitia compilar este programa no GNU Docs no link .

2.3 Shared Libraries

To run a program linked with the shared version of the library the operating system must be able to locate the corresponding .so file at runtime. If the library cannot be found, the following error will occur:

$ ./a.out  ./a.out: error while loading shared libraries: 
libgsl.so.0: cannot open shared object file: No such  file or
directory 

To avoid this error, either modify the system dynamic linker configuration or define the shell variable LD_LIBRARY_PATH to include the directory where the library is installed.

For example, in the Bourne shell (/bin/sh or /bin/bash), the library search path can be set with the following commands:

$ LD_LIBRARY_PATH=/usr/local/lib $ export LD_LIBRARY_PATH $ ./example
    
por 28.06.2015 / 08:02