Como encontro a causa desse erro de vinculador?
-
21-09-2019 - |
Pergunta
Depois de passar por um longo processo para renomear um projeto, meu projeto de DLL não será construído no modo de depuração (o lançamento constrói o trabalho):
MSVCRTD.lib(msvcr90d.dll) : error LNK2005: _CrtDbgReportW already defined in LIBCMTD.lib(dbgrpt.obj)
Este projeto, e as cinco bibliotecas estáticas de que depende, estão definidas para usar "Debug Multi-Thread (/MTD)" (em C/C ++ | Geração de código | Library de tempo de execução). Acredito que libcmtd.lib é o de depuração multithread, mas o que é msvcrtd.lib e o que poderia estar causando esse erro?
Se fizer a diferença, esta DLL é para o Windows CE.
Solução
Libcmt é para que você precisa /mt, msvcrt é o que você precisa /md. Você está vinculando arquivos .OBJ e .lib que foram misturados, alguns compilados com /mt alguns com /md. Isso não é bom.
Geralmente são os arquivos .lib que causam o problema. Revise suas configurações de construção e verifique se a opção /m é a mesma do seu projeto DLL.
Além disso, cuidado com o problema em que você pode ter se a DLL foi compilada com /mt. Você terá grandes problemas quando a DLL retornar ponteiros a objetos que o cliente precisa liberar. Não pode, não usa o mesmo alocador de memória.
Outras dicas
O artigo do MSDN sobre LNK4098 Possui uma tabela muito útil: ele informa quais bibliotecas adicionarem manualmente à lista "Ignorar a biblioteca específica", dependendo da CRT que você está usando. No seu caso, você deve ignorar tudo isso:
libc.lib, libcmt.lib, msvcrt.lib, libcd.lib, libcmtd.lib
Observe que a biblioteca relatada também está nesta lista. O problema é descrito em mais detalhes em KB154753 ... Bibliotecas com as quais um programa se vinculará quando construído usando o Visual C ++
Minha interpretação disso é que, em certas situações, o algoritmo que escolhe automaticamente com quais bibliotecas do CRT vincularão seu código escolherão várias bibliotecas conflitantes.
O que é o conjunto de lançamento também? Definir uma DLL para a depuração multithread pode causar problemas se você alocar memória que algo que aceita a DLL tenta libertar (eles serão alocados em diferentes montes, por exemplo). Tente definir a DLL de depuração com vários threads.
Seu problema de link provavelmente surge porque uma biblioteca para a qual você está vinculando está esperando a DLL de depuração multithread, para que o vinculador tenta vincular ambos e seu link falha ...
O problema é que o msvcr90d.dll não está na imagem do Windows CE. Deve ser implantado com o aplicativo. O msvcr90d.dll está localizado em $ (vcinstalldir)/ce/bin/$ (archfam).
http://stackoverflow.com/questions/15959877/windows-ce-6-0-and-suntime-link-to-debug-dll-mdd