referência indefinida do g ++, embora o símbolo esteja presente no arquivo * .so
Encontrei várias perguntas semelhantes (por exemplo,esta, este ouesta), mas nenhum deles me ajudou a resolver meu problema. Eu tenho um arquivo * .so (a partir do núcleo dognss-sdr) que, conforme indicado por:
$nm libgnss_system_parameters_dyn.so | c++filt |grep Gps_Eph
contém o símboloGps_Ephemeris::Gps_Ephemeris()
, que deveria ser um construtor.
Eu escrevi um código mínimo:
#include <iostream>
#include <core/system_parameters/gps_ephemeris.h>
int main(int argc,const char* argv[])
{
Gps_Ephemeris ge;
return 0;
}
com o qual eu compilar:
g++ main.cpp -std=c++0x -I some_include_path -L some_lib_path -l gnss_system_parameters_dyn`
O vinculador então reclama:
/tmp/ccHCvldG.o: In function `main':
main.cpp:(.text+0x33): undefined reference to `Gps_Ephemeris::Gps_Ephemeris()'
collect2: error: ld returned 1 exit status
Eu também tenteicmake, mas a linha gerada era semelhante a essa (que acabou de adicionar-rdynamic
antes de vincular) e ainda gerava exatamente o mesmo erro do vinculador.
Observe que a biblioteca e meu código mínimo estão sendo compilados com o mesmo compilador (g ++ - 5), com exatamente os mesmos sinalizadores e o mesmo padrão c ++ 0x.
Endereçando a resposta por Maxim Egorushkin, a linha:
nm --demangle --defined-only --extern-only libgnss_system_parameters.so |grep Gps_Eph
não produz nada. No entanto, o símbolo é definido na biblioteca estática (isto é a biblioteca * .a):
00000000000006b0 T Gps_Ephemeris::Gps_Ephemeris()
00000000000006b0 T Gps_Ephemeris::Gps_Ephemeris()
Sabendo que ambos são gerados porcmake, Da seguinte maneira:
add_library(lib_name SHARED ${sources_etc}) #for the *.so
add_library(lib_name_2 ${sources_etc}) #for the *.a
não deve haver diferença nos símbolos contidos / definidos nessas bibliotecas, certo? Eu não notei nada emcmakedocumentação deadd_library
. Estou perdendo algo óbvio?