Estou tentando compilar meu programa e ele retorna este erro:
usr/bin/ld: cannot find -l<nameOfTheLibrary>
no meu makefile, uso o comando g++
e o link para a minha biblioteca, que é um link simbólico para a minha biblioteca localizada em outro diretório.
Existe uma opção para adicionar para que funcione, por favor?
-l
opção (por exemplo, libpthread.so com o qual você já está se vinculando).Respostas:
Se o nome da sua biblioteca for say
libxyz.so
e estiver localizado no caminho, diga:depois, vincule-o ao seu programa:
fonte
Para descobrir o que o vinculador está procurando, execute-o no modo detalhado.
Por exemplo, eu encontrei esse problema ao tentar compilar o MySQL com suporte ao ZLIB. Eu estava recebendo um erro como este durante a compilação:
Eu fiz algumas pesquisas e continuei encontrando diferentes problemas do mesmo tipo, onde as pessoas diriam para garantir que o arquivo .so realmente exista e, se não existir, crie um link simbólico para o arquivo com versão, por exemplo, zlib. so.1.2.8. Mas, quando eu verifiquei, o zlib.so existia. Então, pensei, certamente esse não poderia ser o problema.
Me deparei com outro post no Internets que sugeria executar make com LD_DEBUG = all:
Embora eu tenha uma tonelada de resultados de depuração, não foi realmente útil. Acrescentou mais confusão do que qualquer outra coisa. Então, eu estava prestes a desistir.
Então, eu tive uma epifania. Eu pensei em realmente verificar o texto de ajuda para o comando ld:
A partir disso, eu descobri como executar ld no modo detalhado (imagine isso):
Esta é a saída que eu tenho:
Ding, ding, ding ...
Então, para finalmente consertá-lo para que eu pudesse compilar o MySQL com minha própria versão do ZLIB (em vez da versão empacotada):
Voila!
fonte
-Xlinker --verbose
aos argumentos da linha de comando do gcc para que ele passe essa opção para o ld.-Wl,-Bstatic
. Isso limita a pesquisa apenas aos arquivos .a. A opção detalhada mostrou isso claramente. Depois que eu removi-Wl,-Bstatic
as bibliotecas compartilhadas, também foram pesquisadas.-Wl,--verbose
e passa--verbose
para o vinculador.-Wl,--verbose
para passar detalhes ao vinculador.Parece não haver nenhuma resposta que resolva o problema iniciante muito comum de não instalar a biblioteca necessária em primeiro lugar.
Nas plataformas Debianish, se
libfoo
estiver faltando, você pode instalá-lo frequentemente com algo comoA
-dev
versão do pacote é necessária para o trabalho de desenvolvimento, mesmo o trabalho trivial de desenvolvimento, como compilar o código-fonte para vincular à biblioteca.Às vezes, o nome do pacote requer algumas decorações (
libfoo0-dev
?foo-dev
Sem olib
prefixo? Etc), ou você pode simplesmente usar a pesquisa de pacotes da sua distribuição para descobrir com precisão quais pacotes fornecem um arquivo específico.(Se houver mais de um, você precisará descobrir quais são suas diferenças. Escolher o mais legal ou o mais popular é um atalho comum, mas não um procedimento aceitável para qualquer trabalho sério de desenvolvimento.)
Para outras arquiteturas (principalmente RPM), procedimentos semelhantes se aplicam, embora os detalhes sejam diferentes.
fonte
apt-get install libperl-dev
resolvi para mim. Obrigado :)yum install openssl-devel
solução simples .Tempo de compilação
Quando o g ++ diz
cannot find -l<nameOfTheLibrary>
, significa que o g ++ procurou o arquivolib{nameOfTheLibrary}.so
, mas não conseguiu encontrá-lo no caminho de pesquisa da biblioteca compartilhada, que por padrão aponta para/usr/lib
e/usr/local/lib
e outro lugar talvez.Para resolver esse problema, você deve fornecer o arquivo de biblioteca (
lib{nameOfTheLibrary}.so
) nesses caminhos de pesquisa ou usar a-L
opção de comando-L{path}
diz ao g ++ (na verdadeld
) para encontrar os arquivos da biblioteca no caminho{path}
, além dos caminhos padrão.Exemplo: Supondo que você tenha uma biblioteca
/home/taylor/libswift.so
e que deseja vincular seu aplicativo a essa biblioteca. Nesse caso, você deve fornecer ao g ++ as seguintes opções:Nota 1 : a
-l
opção obtém o nome da biblioteca semlib
e.so
no início e no final.Nota 2 : Em alguns casos, o nome do arquivo da biblioteca é seguido por sua versão, por exemplo
libswift.so.1.2
. Nesses casos, o g ++ também não pode encontrar o arquivo da biblioteca. Uma solução simples para corrigir isso é criar um link simbólico paralibswift.so.1.2
chamadolibswift.so
.Tempo de execução
Quando você vincula seu aplicativo a uma biblioteca compartilhada, é necessário que a biblioteca permaneça disponível sempre que você o executar. Em tempo de execução, seu aplicativo (na verdade, vinculador dinâmico) procura suas bibliotecas no
LD_LIBRARY_PATH
. É uma variável de ambiente que armazena uma lista de caminhos.Exemplo: no caso do nosso
libswift.so
exemplo, o vinculador dinâmico não pode ser encontradolibswift.so
emLD_LIBRARY_PATH
(que aponta para os caminhos de pesquisa padrão). Para corrigir o problema, você deve anexar essa variável ao caminholibswift.so
.fonte
.so
arquivos/usr/lib
, mas ficou interessante para mim seexport
isso ajudaria. Apesar do processo de instalação apósmake
continuar por mais tempo, ocorreu outro erro. Desta vez, o.so.0
arquivo não foi encontrado, mas ambos.so
e.so.0
file estavam no diretório em que eu construí o pacote dependente da origem. Você poderia ajudar com isso?Durante a compilação com
g++
viamake
defineLIBRARY_PATH
se pode não ser apropriado alterar o Makefile com a-L
opção Eu tinha colocado minha biblioteca extra,/opt/lib
então fiz:e depois correu
make
para compilação e vinculação bem-sucedidas.Para executar o programa com uma biblioteca compartilhada, defina:
antes de executar o programa.
fonte
Primeiro, você precisa conhecer a regra de nomeação de
lxxx
:lc
significalibc.so
,lltdl
significalibltdl.so
,lXtst
significalibXts.so
.Então é
lib
+lib-name
+.so
Depois que soubermos o nome, podemos usar
locate
para encontrar o caminho desselxxx.so
arquivo.Se você não conseguir encontrá-lo, precisará instalá-lo
yum
(eu uso o CentOS). Normalmente você tem esse arquivo, mas ele não está vinculado ao lugar certo.Ligue-o ao local certo, geralmente é
/lib64
ou/usr/lib64
$ sudo ln -s /home/user/anaconda3/lib/libiconv.so /usr/lib64/
Feito!
ref: https://i-pogo.blogspot.jp/2010/01/usrbinld-cannot-find-lxxx.html
fonte
locate
só funciona se estiver instalado e funcionando regularmente. Uma solução alternativa é executarfind
em todo o disco, mas é claro que isso levará tempo. Se você fizer isso com frequência, considere instalarlocate
apenas para reduzir o custo (interativo, humano) dessa operação.Ao compilar seu programa, você deve fornecer o caminho para a biblioteca; no g ++, use a opção -L:
fonte
ccmake
para queMakefile
seja criada com o sinalizador vinculado? Quero vincular minha-lARToolkitPlus
bandeira a um caminho.Esse erro também pode ser causado se o link simbólico for para uma biblioteca dinâmica, .so, mas por motivos herdados
-static
aparecer entre os sinalizadores de link. Nesse caso, tente removê-lo.fonte
Verifique a localização da sua biblioteca, por exemplo lxxx.so:
Se não estiver na
/usr/lib
pasta, digite o seguinte:Feito.
fonte
Além das respostas já fornecidas, também pode ser que o arquivo * .so exista, mas não seja nomeado corretamente. Ou pode ser que o arquivo * .so exista, mas seja de propriedade de outro usuário / raiz.
Problema 1: nome impróprio
Se você estiver vinculando o arquivo
-l<nameOfLibrary>
, o nome do arquivo da biblioteca DEVE estar no formatolib<nameOfLibrary>
Se você tiver apenas um<nameOfLibrary>.so
arquivo, renomeie-o!Edição 2: proprietário errado
Para verificar se esse não é o problema - faça
Se o arquivo pertencer à raiz ou a outro usuário, você precisará fazer
fonte
A biblioteca que eu estava tentando vincular tinha um nome não padrão (ou seja, não era prefixado com 'lib'), então eles recomendaram o uso de um comando como este para compilá-lo -
gcc test.c -Iinclude lib/cspice.a -lm
fonte
Aqui estão as informações do Ubuntu do meu laptop.
Eu uso o find para encontrar os arquivos .so para boost_filesystem e boost_system
Em seguida, vincule os arquivos .so a / usr / lib e renomeie para .so
Feito! O pacote R velocyto.R foi instalado com sucesso!
fonte
Eu encontrei a mesma mensagem de erro.
Eu construí o
cmocka
asso
e tentei vinculá-lo ao meu executável. Masld
sempre reclama abaixo:Acontece que existem três arquivos gerados após a
cmocka
compilação:1 e 2 são links de símbolos e apenas 3 é o arquivo real.
Eu apenas copiei o 1 na pasta da minha biblioteca, onde
ld
não encontrei o 3.Depois de copiar todos os 3,
ld
funciona.fonte