Pregunta

He intentado buscar problemas similares, pero no he podido encontrar fácilmente uno que haya ayudado a resolver mi problema.

He creado un proyecto en C ++ y estoy trabajando en UNIX para compilarlo, vincularlo y ejecutarlo. Mi problema específico es una referencia indefinida a un método que declaro en un archivo separado.

En el archivo SharedCache.cpp, tengo el siguiente método:

int SharedCache::replaceLine(ullong address){
    int evictPID = -1;

    int cacheSet = calcCacheSet( address );
    //random uniformly-distributed value for cache line
    float numLines = static_cast<float>(CACHE_LINES_PER_SET);
    uint cacheLine = static_cast<uint>(uniformDistr( numLines ));

    if(cache[cacheSet][cacheLine] != NULL){
        evictPID = cache[cacheSet][cacheLine]->PID;
    }

    uint PID= calcPID(address);
    uint tag= calcTag(address);

    cache[cacheSet][cacheLine]->setLine(PID, tag); //mutex method

    return PID;
}

La línea uint cacheLine = static_cast<uint>( uniformDistr( numLines )); realiza una llamada a la función que quiero usar desde otro archivo. El error del vinculador es una referencia indefinida a este método.

uniformDistr (flotante); se declara en el encabezado distributions.h y se define en distributions.cpp. En mis opciones de proyecto, configuré el indicador de vinculador -distribuciones y también compilé distributions.cpp para asegurarme de que existe un archivo distributions.o para vincular.

Desde aquí, no sé a dónde ir, porque esto no ha resuelto el problema.

¿Fue útil?

Solución

No he usado KDevelop, sin embargo, en la línea de comandos simplemente agregaría distribuciones.o como un archivo de entrada al proceso de vinculación. No es necesario usar guiones ni dejar la extensión .o.

Alternativamente, ¿puede agregar distributions.cpp a su proyecto KDevelop? De esa manera, debe compilarse y vincularse automáticamente (así es como funciona en cosas como Visual Studio o Eclipse).

Otros consejos

Sin información más precisa sobre qué comandos del compilador / enlazador se invocaron y los resultados exactos del error, es difícil proporcionar una buena respuesta.

Sin embargo, según su descripción de lo que hizo, parece que no está pasando distributions.o al vinculador. A diferencia de otros lenguajes donde el compilador / enlazador busca archivos de objetos para enlazar automáticamente, los enlazadores C ++ requieren una especificación explícita de los objetos para enlazar.

Su uso de -ldistributions aquí es incorrecto: el indicador -l se usa para vincular a una biblioteca estática o dinámica (respectivamente archivos .ay .so en Linux), mientras que usted desea especificar otro archivo objeto que el enlazador debería considerar. Si especifica -ldistributions, el enlazador buscará distributions.a o distributions.so en las ubicaciones de biblioteca estándar.

Básicamente, su invocación de enlazador ahora se ve más o menos así (probablemente con muchas más banderas y bibliotecas):

gcc -o my_program SharedCache.o -ldistributions

Para vincular correctamente el código de distribuciones, debe hacer que se vea algo así (de nuevo, probablemente falten muchas banderas y bibliotecas en comparación con las reales):

gcc -o my_program SharedCache.o distributions.o

Esto debería resolver el problema de los símbolos faltantes y producir un binario que funcione (o al menos un error diferente ;-)). Cómo hacer esto en KDevelop, sin embargo, no lo sé.

¿Agregó distributions.cpp a su archivo MAKE? También creo que el indicador de enlace requerido es -ldistributions.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top