Como chegar RPATH com US $ origem para trabalhar em Code :: Blocks GCC?
-
04-07-2019 - |
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?
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).