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.

Foi útil?

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

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