Estou compilando um programa c ++ usando g++
e ld
. eu tenho um.so
biblioteca que desejo usar durante a vinculação. No entanto, existe uma biblioteca com o mesmo nome em /usr/local/lib
e ld
está escolhendo essa biblioteca em vez daquela que estou especificando diretamente. Como posso consertar isso?
Para os exemplos abaixo, meu arquivo de biblioteca é /my/dir/libfoo.so.0
. Coisas que tentei que não funcionam:
- meu comando g ++ é
g++ -g -Wall -o my_binary -L/my/dir -lfoo bar.cpp
- adicionando
/my/dir
ao início ou fim da minha$PATH
variável en` - adicionar
/my/dir/libfoo.so.0
como argumento para g ++
libfoo.*
arquivos existem e onde -.so
w / o.0
,.a
, etc etc?Respostas:
Adicione o caminho para onde sua nova biblioteca está
LD_LIBRARY_PATH
(tem um nome ligeiramente diferente no Mac ...)Sua solução deve funcionar usando as
-L/my/dir -lfoo
opções, em tempo de execução, use LD_LIBRARY_PATH para apontar para a localização de sua biblioteca.Cuidado ao usar LD_LIBRARY_PATH - em resumo (do link):
OU
Use a opção rpath via gcc para vinculador - caminho de pesquisa da biblioteca em tempo de execução, será usado em vez de procurar no diretório padrão (opção gcc):
Isso é bom para uma solução temporária. O vinculador primeiro pesquisa o LD_LIBRARY_PATH para bibliotecas antes de procurar nos diretórios padrão.
Se você não deseja atualizar LD_LIBRARY_PATH permanentemente, pode fazê-lo instantaneamente na linha de comando:
Você pode verificar o que o vinculador de bibliotecas sabe sobre o uso (exemplo):
E você pode verificar qual biblioteca seu aplicativo está usando:
fonte
LD_LIBRARY_PATH
é pesquisado em tempo de execução, em tempo de compilação que você deseja definirLIBRARY_PATH
. Consulte gcc.gnu.org/onlinedocs/gcc/Environment-Variables.htmlgcc myFile.c -o myFile.o -l myLibraryBaseName -Wl,-rpath,locationOfMyLibrary -L locationOfMyLibrary
Essa é uma pergunta antiga, mas ninguém parece ter mencionado isso.
Você estava tendo sorte porque a coisa estava ligando.
Você precisava mudar
para isso:
Seu vinculador rastreia os símbolos que precisa resolver. Se ele ler a biblioteca primeiro, não terá nenhum símbolo necessário, então ignora os símbolos nela. Especifique as bibliotecas após as coisas que precisam ser vinculadas a elas para que seu vinculador tenha símbolos para encontrar nelas.
Além disso,
-lfoo
faz com que ele pesquise especificamente por um arquivo nomeadolibfoo.a
oulibfoo.so
conforme necessário. Nãolibfoo.so.0
. Portanto,ln
nomeie ou renomeie a biblioteca conforme apropriado.Para citar a página de manual do gcc:
Adicionar o arquivo diretamente à
g++
linha de comando de deve ter funcionado, a menos, é claro, que você o coloque antes debar.cpp
, fazendo com que o vinculador o ignore por falta de quaisquer símbolos necessários, porque nenhum símbolo foi necessário ainda.fonte
Especificar o caminho absoluto para a biblioteca deve funcionar bem:
Você se lembrou de remover o
-lfoo
depois de adicionar o caminho absoluto?fonte
@
símbolos com versão? Exemplo mínimo: github.com/cirosantilli/cpp-cheat/blob/…Como alternativa, você pode usar as variáveis de ambiente
LIBRARY_PATH
eCPLUS_INCLUDE_PATH
, que indicam respectivamente onde procurar bibliotecas e onde procurar cabeçalhos (CPATH
também fará o trabalho), sem especificar as opções -L e -I.Editar:
CPATH
inclui cabeçalho com-I
eCPLUS_INCLUDE_PATH
com-isystem
.fonte
export LIBRARY_PATH = /path/to/lib
na mesma sessão de console em que você está compilandoSe um é usado para trabalhar com DLL no Windows e gostaria de pular os números de versão .so no linux / QT, a adição
CONFIG += plugin
eliminará os números de versão. Para usar o caminho absoluto para .so, fornecê-lo ao linker funciona bem, como o Sr. Klatchko mencionou.fonte