erro ligante: referência indefinida C ++
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.
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
.