Aquí podría ser tu PUBLICIDAD


Problema del enlazador, ¿no encuentra un método existente?

votos
0

Ok, estoy teniendo problemas con el enlazador en mi proyecto actual (Esta es una continuación de otra pregunta, ish)

Básicamente, el enlazador proporciona una referencia indefinida en dynamiclib.so para:

std::basic_ostream<char, std::char_traits<char> >& SparseImplementationLib::operator<< <double, double, SparseImplementationLib::DefaultPtr<double, double> >(std::basic_ostream<char, std::char_traits<char> >&, SparseImplementationLib::AbstractSparseNode<double, double, SparseImplementationLib::DefaultPtr<double, double> > const&)

Y solo puedo encontrar:

std::ostream& SparseImplementationLib::operator<< <double, double, SparseImplementationLib::DefaultPtr<double, double> >(std::ostream&, SparseImplementationLib::AbstractSparseNode<double, double, SparseImplementationLib::DefaultPtr<double, double> > const&)
dentro del archivo.

La cosa es que son los mismos métodos, de verdad (¿basic_ostream y ostream son intercambiables?)

Si agrego el primer método de forma manual al espacio de nombres, gime porque ya está definido en tiempo de compilación.

¿Alguien sabe qué diablos podría estar pasando aquí?

Saludos, Ed

Nota: esto es con MPICXX y CCMAKE

Publicado el 12/03/2009 a las 19:42
fuente por usuario Ed James
En otros idiomas...        العربية       

3 respuestas

votos
0

Ok, logré arreglar esto esta mañana después de aproximadamente 10 horas pirateando anoche.

Resulta que se compila si se hacen las definiciones de la función en línea, y se asegura de que tenga opciones para la función con todos los argumentos de la plantilla y solo con los argumentos no predeterminados.

Respondida el 13/03/2009 a las 01:04
fuente por usuario Ed James


Aquí podría ser tu PUBLICIDAD


votos
0

Tuve (casi) el mismo problema con un motor gStreamer like en el que estoy trabajando: una función llamada desde un archivo .so no existía en el código principal.

Descubrí que la función estaba siendo eliminada por el vinculador ya que ninguna función interna la llamaba.

Por el momento, he solucionado el problema forzando a la función a ser incluida por el enlazador a través de una función llamada / constructor, dentro de una función que nunca se llama condicionalmente: -

bool callme = false;

if(callme == true)
{
    dummyfunction();
}

Descubrí que esto obligaba al enlazador a incluir, pero el código nunca se ejecutó.

Si alguien tiene una solución que impida que el vinculador sea tan inteligente, o que hay un método "correcto" para usar, ¡me gustaría saberlo!

Respondida el 13/03/2009 a las 03:12
fuente por usuario James Fisher

votos
0

Parece que no estás enlazando dynamiclib.so con SparseImplementationLib correctamente. ¿Tiene un marcador de enlazador similar a -lSparseImplementationLib en su archivo MAKE?

Respondida el 12/03/2009 a las 07:55
fuente por usuario Harper Shelby