Pergunta

Eu preciso distribuir um binário que será executado em tantas distribuições Linux x86 quanto possível. Isso significa que eu tenho que ligar estaticamente algumas bibliotecas, como glibc, porque o usuário pode não ter o uso versão que eu. Outras bibliotecas têm de ser ligados de forma dinâmica, como fontconfig, porque se baseia em um formato de arquivo cache e locais que podem ser diferentes em cada sistema codificado.

Quais são as opções de linha de comando para fazer isso? Se eu especificar -static, então gcc irá recusar-se a vincular dinamicamente quaisquer bibliotecas em tudo.

Foi útil?

Solução

a ligar estaticamente a qualquer biblioteca do sistema, e especialmente contra libc, em sistemas UNIX ou Linux modernos faz com que o binário significativamente menos portátil. Só não fazê-lo.

Em vez disso, use compatibilidade com versões anteriores (binários ligados em um sistema mais antigo continuará a ser executado em todos os mais novos) para a sua vantagem, ou ligando seu binário em um sistema antigo (eu uso RedHat 6.2, e eu não vi um sistema Linux onde meu binário não será executado nos últimos 8 anos), ou usando algo como autopackage (que foi apagada após esta resposta foi escrito).

Para responder à sua pergunta original:

gcc main.o -Wl,-Bstatic -lfoo -Wl,-Bdynamic

fará com que vinculador usar a versão do arquivo de libfoo. [É importante ter o -Wl,-Bdynamic fuga precisamente para que você não forçar libc estática.]

Outras dicas

Note-se que, sob o Linux, você só pode (com segurança) estaticamente ligar uma biblioteca se nenhuma das bibliotecas dinâmicas dependem dele. Isto significa que se você estiver usando qualquer bibliotecas dinâmicas em tudo, você pode esquecer sobre a vinculação estaticamente libc. Basta usar uma versão bastante antigo para construir contra para o caso do libc; libc manteve forte ABI retro-compatibilidade ao longo dos anos.

Tente passar nos caminhos para os arquivos de biblioteca que você está ligando contra na linha de comando vinculador (sejam eles .a ou .so bibliotecas) e soltar -static. Isso deve fazer o truque.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top