Domanda

Non so se è possibile farlo, ma vorrei che il / NODEFAULTLIB da applicare a un progetto libreria statica.

Ho molti progetti applicativi (a.exe, B.dll, C.dll) che utilizzano una libreria statica comune D.lib. Questa libreria ha un sacco di codice e ha anche altre dipendenze Lib pure. Uno di loro è la libreria OpenSSL, che sembra essere stata costruita per win32 contro la versione di CRT (non ho il progetto / fonti originali).

Finora, per evitare la miscelazione delle versioni Release / debug di CRT, devo mettere la direttiva linker /NODEFAULTLIB:msvcrt.lib in tutti i progetti di foglie (a.exe, B.dll). Questo funziona, ma penso che non è il modo ideale di affrontare tale questione. Ho provato a mettere questa proprietà nel progetto D.lib, ma non ha alcun effetto.

C'è un modo per forzare ++ msvc di ignorare la dipendenza msvcrt.lib dalla biblioteca 3rd party?

È stato utile?

Soluzione

Un lib non ha alcuna impostazione del linker, perché non si collega, si collegare a di esso. Un Lib è solo un archivio di file obj, un po 'come un file .zip compresso -. È per questo che si deve mettere l'impostazione su tutti i progetti che puntano ad esso

Se stai usando VS2005 + è possibile utilizzare fogli di proprietà in modo da mettere soltanto l'impostazione in un posto e quindi utilizzare tale finestra delle proprietà in tutti i progetti.

Tuttavia, OpenSSL è proprio questo - Open Source, così si dovrebbe essere in grado di ottenere la fonte per la versione che si sta utilizzando e costruire di nuovo (e aggiungerlo al vostro sistema di controllo di versione, ovviamente). Ho pensato OpenSSL potrebbe essere costruito come una DLL o LIB, che risolverebbe il problema della DLL non interferirebbe con il collegamento del codice.

In mancanza di questo, si ha sempre la possibilità di taglio la funzionalità fuori in una DLL separata in modo che hai solo problemi con un progetto.

Altri suggerimenti

La mia comprensione è che se LIB biblioteca collegata in modo statico in una DLL, la DLL contiene già tutto il codice corrispondente da LIB. Pertanto, tale accoppiamento non può essere rimosso. Questo si basa solo sulla mia comprensione di linking statico, non su esperimenti.

Per evitare che il libreria di collegamento statico distribuito dalla seconda di una specifica libreria di runtime MSVC è necessario impostare questa opzione del compilatore (in Visual Studio 2010 sembra):

Proprietà di configurazione -> C / C ++ -> Avanzate -> Omettere libreria di default Name = Yes (/ ZI)

Ora gli utenti possono collegarsi al vostro rilascio costruito lib statica dal loro build di debug e non cercare di collegare la libreria di runtime errata causando problemi, così come linkers avvertimenti.

Si noti che possono causare errori di collegamento se la libreria in realtà dipende da una libreria di runtime specifico o il suo comportamento, e componenti compatibili non sono forniti in un altro modo.

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