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?

questionAnswers(2)

yourAnswerToTheQuestion