Pergunta

Este é um aplicativo de console do Windows (na verdade um serviço) que um cara anterior construído há 4 anos e está instalado e funcionando. Agora eu preciso fazer algumas mudanças, mas não pode até mesmo construir a versão atual! Aqui está a saída da compilação:

--------------------Configuration: MyApp - Win32 Debug--------------------
Compiling resources...
Compiling...
Main.cpp
winsock.cpp
Linking...
LINK : warning LNK4098: defaultlib "LIBCMTD" conflicts with use of other libs; use /NODEFAULTLIB:library
Main.obj : error LNK2001: unresolved external symbol _socket_dontblock
Debug/MyApp.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.

MyApp.exe - 2 error(s), 1 warning(s)
--------------------------------------------------------------------------

Se eu usar /NODEFAULTLIB então eu recebo um monte de erros. O código não realmente usar _socket_noblock mas eu não consigo encontrar nada sobre ele na 'net. Presumivelmente, ele é usado por alguma biblioteca Estou ligando para mas eu não sei o que biblioteca é no.

--- Alistair.

Foi útil?

Solução 2

Desculpe, este acaba por ser um problema interno. A combinação de um maverick codificador 4 anos e um sem-nada enferrujado (eu!) Agora.

O código não usa _socket_noblock mas não uso socket_noblock e eu só precisa link para uma das nossas próprias bibliotecas.

Outras dicas

LNK4098 pode não ser um problema. Por exemplo, pode ocorrer se você ligar com uma versão de lançamento de alguma biblioteca que usa ligação de tempo de execução estática e provoca LIBCMT (note a ausência de sufixo "D") para ser adicionado às bibliotecas padrão. Sua aplicação, a ser construído em Debug configuração, usa LIBCMT D , assim o conflito. Pode ser realmente seguro, desde que você não está trocando qualquer coisa com que a biblioteca dependente de tempo de execução.

Quanto _socket_noblock, você pode usar alguns utilitário de pesquisa (como o grep ou encontrar) para procurar essa seqüência em .obj e .lib. Desta forma, você saberá qual biblioteca referências do símbolo, que pode ser um ponto de partida para descobrir que dependências que biblioteca possui.

Você pode usar "Dependency Walker" - uma ferramenta gratuita para encontrar as dependências de sua aplicação, a descobrir como a sua aplicação está ligando para libcmtd. Editar: Você não pode, é claro, o uso que na nova versão que não link (ver comentários), mas você pode usá-lo na versão antiga, ou em bibliotecas conhecidas que a nova versão as ligações com.

No entanto, como o verdadeiro problema não estava relacionado com qualquer coisa que eu sugeri, talvez a questão deve ser fechada.

Parece que você está ligando a diferentes versões do CRT -. Possivelmente porque você está usando bibliotecas construídas antigos juntamente com um novo compilador e versão do CRT

DEFAULTLIB "LIBCMTD" conflitos com uso de outros libs é um aviso que indica que o programa utiliza uma versão diferente da biblioteca de tempo de execução que uma ou mais das suas bibliotecas. Use o mesmo tempo de execução através do programa e bibliotecas, para fazer o aviso de ir embora.

(configurações do projeto) (C ++ separador) categoria (geração de código) (Uso da biblioteca de tempo de execução)

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