Você não diz qual é a distribuição do Linux, mas muitas vezes há um diretório onde você pode adicionar bibliotecas dinamicamente vinculáveis. Em distribuições Redhat como o Fedora, este diretório está aqui, /etc/ld.so.conf.d/
.
LD
Você pode adicionar um arquivo a este diretório com o caminho para sua biblioteca recém-instalada da seguinte forma:
$ cat /etc/ld.so.conf.d/myboost.conf
/usr/local/lib/boost1.55
Em seguida, execute este comando:
$ ldconfig -v
Isso processará todas as bibliotecas e reconstruirá um "cache", /etc/ld.so.cache
. Esse cache é usado para localizar bibliotecas quando elas são especificadas da seguinte forma: -lboost_thread-mgw46-mt-sd-1_54
.
Exemplo de saída
$ ldconfig -v
/usr/lib64/atlas:
libclapack.so.3 -> libclapack.so.3.0
libptcblas.so.3 -> libptcblas.so.3.0
libf77blas.so.3 -> libf77blas.so.3.0
libcblas.so.3 -> libcblas.so.3.0
liblapack.so.3 -> liblapack.so.3.0
libptf77blas.so.3 -> libptf77blas.so.3.0
libatlas.so.3 -> libatlas.so.3.0
/usr/lib64/wxSmithContribItems:
libwxflatnotebook.so.0 -> libwxflatnotebook.so.0.0.1
...
Ao adicionar caminhos à configuração, eu gostaria de confirmar passando por essa saída para ter certeza de que as coisas estão sendo escolhidas da maneira que eu esperava.
cache do LD
Você também pode imprimir o conteúdo do arquivo .cache usando este comando:
$ ldconfig -p | head -10
2957 libs found in cache '/etc/ld.so.cache'
lib3ds-1.so.3 (libc6,x86-64) => /usr/lib64/lib3ds-1.so.3
libzvbi.so.0 (libc6,x86-64) => /usr/lib64/libzvbi.so.0
libzvbi-chains.so.0 (libc6,x86-64) => /usr/lib64/libzvbi-chains.so.0
libzrtpcpp-1.4.so.0 (libc6,x86-64) => /usr/lib64/libzrtpcpp-1.4.so.0
libzmq.so.1 (libc6,x86-64) => /usr/lib64/libzmq.so.1
libzmq.so (libc6,x86-64) => /usr/lib64/libzmq.so
libzipios.so.0 (libc6,x86-64) => /usr/lib64/libzipios.so.0
libzipios.so (libc6,x86-64) => /usr/lib64/libzipios.so
libzip.so.1 (libc6,x86-64) => /usr/lib64/libzip.so.1
Por que minha saída do ldd ainda está usando 1.53?
Isso porque seu binário está usando bibliotecas dinâmicas. Então, quando o binário foi compilado, foi contra as versões 1.55 das bibliotecas. No entanto, quando você interroga o binário usando ldd
, ele está dentro do ambiente que está usando o conteúdo do arquivo .cache
. Portanto, a biblioteca dentro do cache que está associada aos símbolos usados por esse binário corresponde àquela de 1.53, portanto você está vendo essas bibliotecas.
O seu ambiente não conhece nada das bibliotecas 1.55, apenas o seu ambiente de compilação, ou seja, o seu Makefile, está ciente disso.
Bibliotecas dinâmicas
Pense nas funções dentro delas como símbolos. Os símbolos são um nome e, portanto, esses nomes geralmente não mudam de uma versão de uma biblioteca para outra. Então, se você olhar uma biblioteca como o boost, poderá usar a ferramenta readelf
para obter uma lista dos símbolos dentro de um desses arquivos .so
.
Exemplo
$ readelf -Ws /usr/lib64/libboost_date_time-mt.so | head -10
Symbol table '.dynsym' contains 261 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
1: 000000335aa096a8 0 SECTION LOCAL DEFAULT 9
2: 0000000000000000 0 FUNC GLOBAL DEFAULT UND _ZNSt8bad_castD2Ev@GLIBCXX_3.4 (2)
3: 0000000000000000 0 FUNC GLOBAL DEFAULT UND _ZNSt6locale5_ImplD1Ev@GLIBCXX_3.4 (2)
4: 0000000000000000 0 OBJECT GLOBAL DEFAULT UND _ZTINSt6locale5facetE@GLIBCXX_3.4 (2)
5: 0000000000000000 0 FUNC GLOBAL DEFAULT UND wcslen@GLIBC_2.2.5 (3)
6: 0000000000000000 0 OBJECT GLOBAL DEFAULT UND _ZTISt11logic_error@GLIBCXX_3.4 (2)
Na saída acima, você pode ver algumas das definições de FUNC
, estes são os nomes que são usados para "vincular" uma função em um executável com uma função de alguma biblioteca .so
.