Pergunta

Eu tentei olhar para problemas semelhantes, mas não poderia facilmente encontrar um que ajudou o meu problema.

Eu criei um projeto em C ++ e estou trabalhando em UNIX para compilar, link, e executá-lo. Meu problema específico é uma referência indefinida para um método Declaro em um arquivo separado.

No arquivo SharedCache.cpp, eu tenho o seguinte 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;
}

O uint cacheLine = static_cast<uint>( uniformDistr( numLines )); linha faz uma chamada para a função que deseja usar outro arquivo. O erro vinculador é uma referência indefinida para esse método.

uniformDistr (float); é declarado no distributions.h cabeçalho e definido em distributions.cpp. Em minhas opções do projeto I definir as -distributions bandeira vinculador e eu também compilou o distributions.cpp para certificar-se de um arquivo distributions.o existe para ligação com.

A partir daqui, eu não sei para onde ir, porque isso não resolveu o problema.

Foi útil?

Solução

Eu não usei KDevelop, no entanto, na linha de comando que você gostaria apenas de acrescentar distributions.o como um arquivo de entrada para o processo de vinculação. Não há necessidade de traços ou deixando de fora a extensão .o.

Como alternativa, você pode simplesmente adicionar distributions.cpp ao seu projeto KDevelop? Dessa forma, ele deve se compilado e ligado automaticamente (isso é como ele funciona em coisas como Visual Studio ou Eclipse).

Outras dicas

Sem informações mais precisas sobre qual compilador / vinculador comandos foram invocados e as saídas de erro exatas, é difícil dar uma resposta boa.

No entanto, a partir de sua descrição do que você fez, parece que você não está passando distributions.o para o vinculador. Ao contrário de outras línguas onde o compilador pesquisa / vinculador para arquivos objeto a ligação automaticamente, os ligantes C ++ requerem uma especificação explícita dos objetos a ligação juntos.

O uso do -ldistributions aqui está incorreto: a bandeira -l é usada para ligação a um estático ou dinâmico biblioteca (respectivamente .a e arquivos .so no Linux), enquanto você deseja especificar outra arquivo objeto que o vinculador deve considerar. Especificando -ldistributions faz o olhar vinculador para distributions.a ou distributions.so nos locais de biblioteca padrão.

Basicamente, a sua invocação vinculador agora é algo como isto (provavelmente com muitos mais bandeiras e bibliotecas):

gcc -o my_program SharedCache.o -ldistributions

Para fazer o link corretamente o código de distribuições, você precisa torná-lo parecido com (novamente, muitas bandeiras e bibliotecas provavelmente desaparecidas em comparação com a coisa real):

gcc -o my_program SharedCache.o distributions.o

Isto deve resolver os símbolos falta emitir e produzir um binário de trabalho (ou pelo menos um erro diferente ;-)). Como fazer isso em KDevelop no entanto eu não sei.

Será que você adicionar a distributions.cpp ao seu makefile? Também acredito que o sinalizador de vinculador necessário é -ldistributions.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top