Domanda

Questa è un'applicazione Windows Console (in realtà un servizio) che un ragazzo precedente ha costruito 4 anni fa ed è installato e funzionante. Ora devo apportare alcune modifiche, ma non riesco nemmeno a costruire la versione corrente! Ecco l'output di build:

--------------------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 uso / NODEFAULTLIB , ricevo molti errori. Il codice in realtà non utilizza _socket_noblock ma non riesco a trovare nulla su di esso su 'net. Presumibilmente è utilizzato da alcune librerie a cui mi sto collegando ma non so in quale libreria si trovi.

--- Alistair.

È stato utile?

Soluzione 2

Siamo spiacenti, questo si rivela essere un problema interno. Una combinazione di un programmatore anticonformista 4 anni fa e un no-nothing arrugginito (io!) Ora.

Il codice non utilizza _socket_noblock ma utilizza usa socket_noblock e devo solo collegarmi a una delle nostre librerie.

Altri suggerimenti

LNK4098 potrebbe non essere un problema. Ad esempio, può verificarsi se ci si collega a una versione di rilascio di alcune librerie che utilizza un collegamento runtime statico e fa sì che LIBCMT (notare l'assenza del suffisso "D") venga aggiunto alle librerie predefinite. La tua applicazione, essendo costruita nella configurazione di Debug, utilizza LIBCMT D , quindi il conflitto. Potrebbe essere effettivamente sicuro, a condizione che non si stia scambiando nulla dipendente dal runtime con quella libreria.

Per quanto riguarda _socket_noblock , puoi usare alcune utility di ricerca (come grep o find) per cercare questa stringa nei file .obj e .lib. In questo modo saprai quale libreria fa riferimento al simbolo, che potrebbe essere un punto di partenza per scoprire quali dipendenze ha quella libreria.

Puoi utilizzare " Dependency Walker " - uno strumento gratuito per trovare le dipendenze della tua applicazione, per capire come l'applicazione si collega a libcmtd. Modifica: non puoi, ovviamente, utilizzarlo sulla nuova versione che non riesce a collegarsi (vedi commenti), ma puoi usarlo sulla vecchia versione o su librerie conosciute che la nuova versione collegamenti con.

Tuttavia, poiché il vero problema non era correlato a nulla di ciò che ho suggerito, forse la domanda dovrebbe essere chiusa.

Sembra che tu stia collegando a diverse versioni del CRT, probabilmente perché stai usando vecchie librerie costruite insieme a un nuovo compilatore e versione del CRT.

defaultlib " LIBCMTD " è in conflitto con l'uso di altre librerie è un avvertimento che indica che il tuo programma utilizza una versione diversa della libreria di runtime che una o più librerie. Usa lo stesso runtime su tutto il programma e le librerie, per far sparire l'avvertimento.

(impostazioni del progetto) (scheda c ++) categoria (generazione di codice) (usa la libreria di runtime)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top