Pergunta

Estou tentando ligar um RPATH contendo a string $ ORIGIN especial em um arquivo executável construído usando GCC com o Code :: Blocks IDE. Eu especificado

-Wl,-R$ORIGIN

nas opções vinculador para o projeto, mas a saída de linha de comando para GCC está errado (despojado para maior clareza):

g++ -Wl,-R

O que é a maneira correta de especificar este argumento para Code :: Blocks?

Foi útil?

Solução

Quem decidiu fazer a $ ORIGIN token é um bastardo do mal que merece um lugar especial no inferno programador. Desde '$' é um caractere especial para o bash e outras linguagens de script, como marca, ele parafusos tudo a menos que cuidadosamente escapou. Ainda pior, dependendo de qual ambiente de compilação que você está usando, os detalhes de como escapar corretamente irá mudança provável.

Em bash, você precisa ficar uma barra invertida na frente do $:

-Wl,-R\$ORIGIN

Code :: Blocks, aparentemente, também trata a $ como especial. Então, Código tudo o controlador subprocess :: Blocks envia o comando para trata a barra invertida como especial. Assim, tanto a barra invertida e os US $ precisa ser dobrada para cima para se escapou corretamente. Portanto, Code :: Blocks vinculador configurações, você precisa especificar:

-Wl,-R\\$$ORIGIN

... quais saídas:

-Wl,-R\\$ORIGIN

... para o registo de compilação, mas o shell realmente é enviado:

-Wl,-R\$ORIGIN

... que, como mencionado acima produz o resultado desejado.

O que é uma dor.

Outras dicas

Além de kblucks resposta que trata da questão para o código: Blocos .... Para aqueles que como eu tropecei através desta página procurando como fazer isso com Make. O truque é usar um sinal $ extra como um caractere de escape e coloque-o com citações:

-Wl,-R,'$$ORIGIN/../lib'

explicação completa pode ser tido aqui: Usando ORIGEM para um tempo de execução dinâmica biblioteca caminho de pesquisa

Não Se o seu executável está sendo construído por uma enorme ambiente de script complexo criado por você, e você não quer se aprofundar com isso, tentando correr com setenv LD_RUN_PATH='$ORIGIN/../lib'; se isso não funcionar, uma abordagem pragmática é criar um wrapper para ld:

#!/bin/sh
exec /usr/bin/ld -R '$ORIGIN/../lib' "$@"

... em seguida, fazer a compilação com que toco no caminho. Na prática, pode ser chamado para construir arquivos .so ou outros executáveis, assim você pode precisar para tornar este um roteiro mais complexo que decide se quer inserir a RPATH. OR, construção executado sem isso, e com, e cereja escolha.

(aqui "/ usr / bin / ld" é a ld que normalmente teria sido executado, o que pode estar em outro lugar. Gcc pode não pegar ld do caminho, ver variáveis ??de ambiente gcc para substituir isso. Milhagem pode variar . Apenas para utilização única. Não garantido para ser menos terrível do que qualquer outra abordagem).

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