PDA

View Full Version : [VC++]Le DLL buildate non hanno la lib corrispondente...


Tommo
13-06-2009, 20:04
Salve,
come al solito stavo complicandomi la vita, tentando di scindere la mia engine in 3 dll separate, ognuna ad un livello di astrazione diverso (Core, Library, Engine).

Lo problema è che, sebbene compila tutto, il linking non va a buon fine poichè di queste 3 dll non vengono prodotte le librerie corrispondenti...
e quelle al livello inferiore interrompono il linking segnalando la mancanza.

Non so bene cosa dovrei fare per convincerlo a buildare l'accoppiata lib + dll, dato che ha SEMPRE fatto in questa maniera, se era selezionato "Libreria Dinamica (.dll)" come tipo di output...

Come dovrei fare per convincerlo a continuare così?
Scommetto che è una cavolata da qualche parte ma proprio non saprei dove mettere mano :asd:

fero86
13-06-2009, 23:24
controlla che sia impostato un nome valido per l'opzione /IMPLIB del linker (impostazioni del progetto, Linker, Advanced, Import Library; controlla che il nome sia impostato sia per la configurazione di Debug sia per quella di Release). di norma nell'IDE quell'opzione viene impostata a "$(TargetDir)$(TargetName).lib", dove $(TargetDir) e $(TargetName) sono due macro che l'IDE espande quando costruisce la command line.

Tommo
14-06-2009, 13:11
Per puro caso ci sono arrivato anche io... per sicurezza ci ho copiato proprio il path dove vorrei che mettesse la library, ma non viene generato proprio niente :(

Devo settarla anche per Release oppure non va?

fero86
14-06-2009, 14:47
se non stavi compilando in modalità di Release non è quello il problema; puoi incollare command line e output del linker?
prova anche a fare una cosa banalissima, ovvero prima un clean di tutta la soluzione e poi un rebuild totale, perché non vorrei che il problema fosse banalmente che in realtà c'è qualche errore e lui non builda un bel niente, e la DLL che vedi è rimasta dall'ultima successful build :D

Tommo
14-06-2009, 16:07
Distrutta la cartella e rifatto, la dll non rimaneva dalla build precedente :stordita:

Cmq ecco il log:
1>------ Rebuild All started: Project: CRenderCore, Configuration: Debug Win32 ------
1>Deleting intermediate and output files for project 'CRenderCore', configuration 'Debug|Win32'
1>Compiling...
**niente errori**
1>Linking...
1>LINK : D:\DEV\CRender\\bin\Debug\CRenderCore.dll not found or not built by the last incremental link; performing full link
1>Embedding manifest...
1>Microsoft (R) Windows (R) Resource Compiler Version 6.0.5724.0
1>Copyright (C) Microsoft Corporation. All rights reserved.
1>Build log was saved at "file://d:\DEV\CRender\Core\Debug\BuildLog.htm"
1>CRenderCore - 0 error(s), 1 warning(s)

2>------ Rebuild All started: Project: CRenderLibrary, Configuration: Debug Win32 ------
2>Deleting intermediate and output files for project 'CRenderLibrary', configuration 'Debug|Win32'
2>Compiling with CUDA Build Rule...
**un sacco di warning**
2>Compiling...
**parecchi altri warning**
2>nedmalloc.c
2>Linking...
2>LINK : fatal error LNK1181: cannot open input file 'CRenderCore.lib'
2>Build log was saved at "file://d:\DEV\CRender\Library\Debug\BuildLog.htm"
2>CRenderLibrary - 1 error(s), 62 warning(s)

Non saprei proprio cosa non va :stordita:

Vincenzo1968
14-06-2009, 17:12
Praticamente, nelle soluzioni "multi-projects", devi specificare l'ordine di build.

Per esempio, se abbiamo una soluzione che contiene due progetti di DLL: DllA e DllB, dove DllB utilizza le funzioni di DllA, dobbiamo agire così:

Click destro sulla soluzione:

http://www.guidealgoritmi.it/images/ImgForums/multi01.jpg

Scegli la voce "Projects Build Order"
Seleziona il tab "Dependencies"

Nella combo Projects seleziona "DllB"
Nella lista "Depends on" metti il segno di spunta su "DllA":

http://www.guidealgoritmi.it/images/ImgForums/multi02.jpg

Tommo
14-06-2009, 19:47
già builda nel giusto ordine :sofico:
Infatti la lib non c'è quando serve, ma la dll si... ho controllato!

Continua ad essere strano :confused:

banryu79
15-06-2009, 11:44
1>------ Rebuild All started: Project: CRenderCore, Configuration: Debug Win32 ------
1>Deleting intermediate and output files for project 'CRenderCore', configuration 'Debug|Win32'
1>Compiling...
**niente errori**
1>Linking...
1>LINK : D:\DEV\CRender\\bin\Debug\CRenderCore.dll not found or not built by the last incremental link; performing full link
1>Embedding manifest...
1>Microsoft (R) Windows (R) Resource Compiler Version 6.0.5724.0
1>Copyright (C) Microsoft Corporation. All rights reserved.
1>Build log was saved at "file://d:\DEV\CRender\Core\Debug\BuildLog.htm"
1>CRenderCore - 0 error(s), 1 warning(s)

Ma il doppio backslash prima di "bin" nel path per CRenderCore.dll è normale?

Tommo
15-06-2009, 15:16
Nuh, infatti l'ho fixato ma non cambia niente... apparte che ora trova il file.
Però comunque non scrive la lib :stordita:

deve starci qualche errore da qualche parte evidentemente.

Tommo
16-06-2009, 21:31
So che ormai il thread era defunto, ma metto la soluzione uguale:

In pratica, non stavo esportando alcuna classe, e il file non veniva creato...
avevo scordato _declspec(dllexport) :doh:

Ora l'ho messo e va :D

fero86
16-06-2009, 21:56
se avessi postato anche la command line del linker come ti avevo chiesto ce ne saremmo accorti: avremmo notato che mancava il file .def :D :Prrr:

Tommo
16-06-2009, 22:06
vabbè me ne ero scordato... anche perchè non so nemmeno dove si rimedia la command line attuale del linker, io vi avrei massimo potuto dare quella col $(qualcosa) che non aiutava sicuro.:stordita:

fero86
18-06-2009, 20:43
vabbè me ne ero scordato... anche perchè non so nemmeno dove si rimedia la command line attuale del linker, io vi avrei massimo potuto dare quella col $(qualcosa) che non aiutava sicuro.:stordita: nel build log salvato in "d:\DEV\CRender\Core\Debug\BuildLog.htm" oppure nelle opzioni del linker, tab "Command Line".