Ao compilar o openvswitch-1.5.0, encontrei o seguinte erro de compilação:
gcc -Wstrict-prototypes -Wall -Wno-sign-compare -Wpointer-arith
-Wdeclaration-after-statement -Wformat-security -Wswitch-enum -Wunused-parameter -Wstrict-aliasing -Wbad-function-cast -Wcast-align -Wstrict-prototypes -Wold-style-definition -Wmissing-prototypes -Wmissing-field-initializers -Wno-override-init -g -O2 -export-dynamic ***-lpthread*** -o utilities/ovs-dpctl utilities/ovs-dpctl.o lib/libopenvswitch.a
/home/jyyoo/src/dpdk/build/lib/librte_eal.a
/home/jyyoo/src/dpdk/build/lib/libethdev.a
/home/jyyoo/src/dpdk/build/lib/librte_cmdline.a
/home/jyyoo/src/dpdk/build/lib/librte_hash.a
/home/jyyoo/src/dpdk/build/lib/librte_lpm.a
/home/jyyoo/src/dpdk/build/lib/librte_mbuf.a
/home/jyyoo/src/dpdk/build/lib/librte_ring.a
/home/jyyoo/src/dpdk/build/lib/librte_mempool.a
/home/jyyoo/src/dpdk/build/lib/librte_malloc.a -lrt -lm
/usr/bin/ld: /home/jyyoo/src/dpdk/build/lib/librte_eal.a(eal.o): undefined reference
to symbol 'pthread_create@@GLIBC_2.2.5'
/lib/x86_64-linux-gnu/libpthread.so.0: error adding symbols: DSO missing from
command line
Se eu tentar ver os símbolos de libpthread
, parece ótimo.
$ readelf -s /lib/x86_64-linux-gnu/libpthread.so.0 | grep pthread_create
199: 0000000000008220 2814 FUNC GLOBAL DEFAULT 13 pthread_create@@GLIBC_2.2.5
173: 0000000000008220 2814 FUNC LOCAL DEFAULT 13 __pthread_create_2_1
462: 0000000000008220 2814 FUNC GLOBAL DEFAULT 13 pthread_create@@GLIBC_2.2
Você poderia dar dicas ou sugestões?
gcc
compiler-errors
linker
undefined-reference
jaeyong
fonte
fonte
gcc
nãog++
Respostas:
Você deve mencionar a biblioteca na linha de comando após a compilação dos arquivos de objeto:
Explicação: o link depende da ordem dos módulos. Os símbolos são solicitados primeiro e depois vinculados a partir de uma biblioteca que os possui. Portanto, você deve especificar os módulos que usam as bibliotecas primeiro e as bibliotecas depois deles. Como isso:
Além disso, caso haja uma dependência circular, você deve especificar a mesma biblioteca na linha de comando várias vezes. Portanto, caso
libb
precise de um símbololibc
elibc
precise de um símbololibb
, a linha de comando deve ser:fonte
-Wl,--start-group -la -lb- -lc -Wl,--end-group
por dependências circulares.A mensagem de erro depende da versão da distribuição / compilador:
Ubuntu Saucy:
Ubuntu Raring: (mais informativo)
Solução: pode estar faltando uma biblioteca em suas etapas de compilação, durante o estágio de vinculação. No meu caso, adicionei '-lz' aos sinalizadores makefile / GCC.
Background: DSO é um objeto compartilhado dinâmico ou uma biblioteca compartilhada.
fonte
glewInit
, you need-lGLEW
fundo
o
DSO missing from command line
mensagem será exibida quando o vinculador não encontrar o símbolo necessário em sua pesquisa normal, mas o símbolo estiver disponível em uma das dependências de uma biblioteca dinâmica especificada diretamente.No passado, o vinculador considerava símbolos em dependências de idiomas especificados como disponíveis. Mas isso mudou em alguma versão posterior e agora o vinculador impõe uma visão mais rigorosa do que está disponível. A mensagem, portanto, pretende ajudar nessa transição.
O que fazer?
Se você é o mantenedor do software
Você deve resolver esse problema, certificando-se de que todas as bibliotecas necessárias para satisfazer os símbolos necessários sejam especificadas diretamente na linha de comando do vinculador. Lembre-se também de que a ordem geralmente importa.
Se você está apenas tentando compilar o software
Como solução alternativa, é possível voltar à visualização mais permissiva de quais símbolos estão disponíveis usando a opção
-Wl,--copy-dt-needed-entries
.As maneiras comuns de injetar isso em uma compilação são exportar LDFLAGS antes da execução
configure
ou algo semelhante:Às vezes, passar
LDFLAGS="-Wl,--copy-dt-needed-entries"
diretamente paramake
também pode funcionar.fonte
-Wl,
bit ou tem um vinculador que não suporta essas opções. Qual vinculador você está usando? Esta resposta assume o vinculador binutils clássico (ld.bfd). O vinculador binutils gold (ld.gold) documenta--copy-dt-needed-entries
como "Não suportado". Portanto, se você possui isso (ou qualquer outro vinculador que não suporte essa opção) como padrão, pode ser necessário seguir a seção para mantenedores ou alternar para o ld clássico para vinculação. Eu acho que você pode usar-fuse-ld=ld.bfd
para isso.Encontrei outro caso e, portanto, acho que está tudo errado.
Isto é o que eu tinha:
O problema é que a linha de comando NÃO contém
-lX11
- embora o libX11.so deva ser adicionado como uma dependência, porque também havia bibliotecas GTK e GNOME nos argumentos.Portanto, a única explicação para mim é que essa mensagem pode ter sido destinada a ajudá-lo , mas não foi corretamente. Provavelmente isso foi simples: a biblioteca que fornece o símbolo não foi adicionada à linha de comando.
Observe três regras importantes relacionadas à ligação no POSIX:
-l<name>
, você nunca sabe se serálib<name>.so
ou nãolib<name>.a
. A biblioteca dinâmica é preferida, se encontrada, e as bibliotecas estáticas podem ser aplicadas apenas pela opção do compilador - isso é tudo. E se você tiver algum problema como acima, depende se você possui bibliotecas estáticas ou dinâmicasfonte
Eu descobri que tinha o mesmo erro. Eu estava compilando um código com lapack e blas. Quando mudei a ordem em que as duas bibliotecas foram chamadas, o erro desapareceu.
"LAPACK_LIB = -llapack -lblas" funcionou onde "LAPACK_LIB = -lblas -llapack" deu o erro descrito acima.
fonte
find_package(Threads)
etarget_link_libraries( ... ${CMAKE_THREAD_LIBS_INIT})
Eu também encontrei o mesmo problema. Não sei porque, apenas adiciono
-lpthread
opção ao compilador e tudo ok.Velho:
obteve o seguinte erro. Se eu anexar a
-lpthread
opção ao comando acima, então OK.fonte
O que descobri é que, às vezes, a biblioteca que o vinculador reclama não é a que está causando o problema. Possivelmente, há uma maneira inteligente de descobrir onde está o problema, mas é isso que eu faço:
@ Peter Karasev: Eu me deparei com o mesmo problema com um projeto cmake do gcc 4.8.2 no CentOS7. A ordem das bibliotecas na seção "target_link_libraries" é importante. Eu acho que o cmake apenas passa a lista para o vinculador como está, ou seja, ele não tenta e trabalha na ordem correta. Isso é razoável - quando você pensa sobre isso, não pode saber qual é a ordem correta até que o vínculo seja concluído com êxito.
fonte
Adicione:
CFLAGS="-lrt"
eLDFLAGS="-lrt"
fonte
O mesmo problema aconteceu comigo quando uso
distcc
para criar meu projeto c ++; Finalmente eu resolvi isso comexport CXX="distcc g++"
.fonte
Se você estiver usando cmake e pthreads, tente adicionar as seguintes linhas
fonte
O mesmo aconteceu comigo quando eu estava instalando o benchmark HPCC (inclui HPL e alguns outros benchmarks). Eu adicionei
-lm
aos sinalizadores do compilador no meu script de compilação e, em seguida, ele foi compilado com êxito.fonte
Se usar
g++
, certifique-se de que você não está executandogcc
vezfonte
Tente adicionar
-pthread
no final da lista da biblioteca no Makefile .Funcionou para mim.
fonte
Se você estiver usando o CMake, existem algumas maneiras de resolvê-lo:
Solução 1: A mais elegante
Solução 2: usando o CMake
find_package
Solução 3: Alterar sinalizadores do CMake
fonte