GCC e ld não consegue encontrar símbolos exportados ... mas eles estão lá
-
03-07-2019 - |
Pergunta
Eu tenho uma biblioteca C ++ e um aplicativo de C ++ tentando usar funções e classes exportados a partir da biblioteca. A biblioteca constrói finas ea aplicação compila mas não consegue link. Os erros fico seguir esta forma:
.aplicativo de código-file.cpp :( texto + 0x2fdb): undefined reference to `lib-namespace :: GetStatusStr (int) '
As aulas na biblioteca parecem ser resolvido muito bem pelo vinculador, mas funções livres e dados exportados (como uma tabela de pesquisa cosseno), invariavelmente, resultam no erro acima.
Eu estou usando Ubuntu 8.04 (Hardy), e é atualizado com os últimos pacotes do Ubuntu.
O comando para vincular a biblioteca é (com outras bibliotecas removido):
g++ -fPIC -Wall -O3 -shared -Wl,-soname,lib-in-question.so -o ~/project/lib/release/lib-in-question.so
O comando para ligar a aplicação é (com outras bibliotecas removidos):
g++ -fPIC -Wall -O3 -L~/project/lib/release -llib-in-question -o ~/project/release/app-in-question
Finalmente, parece (o melhor que eu posso dizer) que os símbolos em questão estão sendo exportados corretamente:
nm -D ~/project/lib/release/lib-in-question.so | grep GetStatusStr --> U _ZN3lib-namespace12GetStatusStrEi
Solução
U antes _ZN3lib-namespace12GetStatusStrEi nos shows de saída nm que o símbolo é indefinido na biblioteca.
Talvez seja definida no namespace errado:. Parece que você está chamando-o em lib-namepace mas você pode estar definindo-o em outro
Outras dicas
Tem sido um tempo, mas se você especificar um lib com a opção -l, então você não tem a pular o lib prefixo?
(eu mudei o nome de "lib-in-question.so" para "libfoobar.so" para facilitar a leitura para o exemplo abaixo)
g++ -fPIC -Wall -O3 -L~/project/lib/release -lfoobar
ou
g++ -fPIC -Wall -O3 ~/project/lib/release/libfoobar.so