Software Design

Design de software em C, C++, Java, etc…

C++: “Linkagem” estática da libstdc++

Quem programa em C++ para Linux e precisa gerar binários que rodem em diferentes distribuições sabe como isso pode ser uma tarefa árdua. Isso ocorre porque o programa linkado com uma versão da libstdc++ pode não rodar em outra distribuição que tenha uma versão diferente dessa biblioteca.

Uma forma de contornar esse problema é linkar a libstdc++ de forma estática, mas para linkar ela será necessário linkar também libgcc desta forma. Basicamente o que precisamos fazer é:

$ ln -s `g++ -print-file-name=libstdc++.a`
$ g++ -static-libgcc -L. main.cpp

O primeiro comando apenas cria um link simbólico apontando para o caminho da libstdc++ que será utilizada pelo g++ na hora da linkagem.

O comando seguinte seta a flag ‘-static-libgcc’ para fazer com que o linker tente fazer linkagem estática dessa biblioteca e a flag “-L.” adiciona o diretório atual no caminho de busca para as bibliotecas, como criamos o link simbólico para a libstdc++.a ela será usada. Após isso teremos um binário que não tem dependência da libstdc++ nem da libgcc:

$ ldd a.out
linux-vdso.so.1 (0x00007fffa45ff000)
libc.so.6 => /usr/lib/libc.so.6 (0x00007f9e19548000)
/lib/ld-linux-x86-64.so.2 (0x00007f9e19e05000)

Referências:

Deixe um comentário

Informação

Publicado às dezembro 13, 2012 por em C++, Linux e marcado , , , , .