unresolved - Collegamento di molti.libs per creare una DLL: simbolo esterno non risolto_DllMainCRTStartup




lnk2019 unresolved external symbol (2)

Sto eseguendo il (terrificante) compito di costruire LLVM 3.3 su Windows e sono arrivato allo stadio in cui ho un carico di file LLVM*.lib . Voglio collegarli insieme a una grande DLL condivisa, ma sto lottando (questa è la mia prima volta che collega cose su Windows). Ho provato:

link /DLL /MACHINE:X64 /OUT:LLVM3.3.dll LLVM*.lib

ma senza risultato. Errori con:

LINK : warning LNK4001: no object files specified; libraries used
LINK : error LNK2001: unresolved external symbol _DllMainCRTStartup
LLVM3.3.dll : fatal error LNK1120: 1 unresolved externals

Internet ha suggerito di aggiungere l' /DEFAULTLIB:corelib , quindi l'ho fatto, ma di nuovo ha problemi:

> link /DLL /MACHINE:X64 /DEFAULTLIB:corelibc /OUT:LLVM3.3.dll LLVM*.lib

LINK : warning LNK4001: no object files specified; libraries used
LINK : fatal error LNK1104: cannot open file 'corelibc.lib'

Come faccio a fare questo?

EDIT: Sono riuscito a risolvere il problema sopra, implementando un DllMain vuoto e facendo un EmptyDllMain.obj da esso:

#include <windows.h>

BOOL APIENTRY DllMain( HANDLE hModule, 
                   DWORD  ul_reason_for_call, 
                   LPVOID lpReserved
                 )
{
    return TRUE;
}

e poi provando:

link /DLL /OUT:LLVM3.3.dll LLVM*.lib EmptyDllMain.obj

ma la DLL che ottengo è solo 8kb - sembra che abbia perso molti megabyte di librerie LLVM! Come posso averli inclusi?

EDIT2: Ho risolto la compilazione LLVM su Windows, dai un'occhiata a questo documento su github .


L'ho avuto una volta mentre collegavo una lib con una piattaforma sbagliata insieme (da X86 a X64). Assicurati che tutti i LLVM * .lib siano compilati e collegati con la toolchain corretta:

[...]\Microsoft visual Studio 10.0\VC\bin\amd64\ cl.exe and link.exe

che ottieni chiamando

"%PROGRAMFILES(X86)%\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" amd64

Inoltre ho avuto problemi simili durante il mixaggio di MT e MD CRT, consiglio di attenervisi

/MD (or /MDd for debug) 

durante la compilazione degli oggetti per qualsiasi LLVM * .lib (e qualsiasi altro oggetto da altre librerie esterne collegate a questi).

[modificare]

E butta fuori quel brutto EmptyDllMain.obj!

[/modificare]


Se hai inserito manualmente _DllMainCRTStartup , assicurati di averlo digitato correttamente (watch case). Avevo _DLLMainCRTStartup e ho impiegato un po 'per _DLLMainCRTStartup perché ho ancora ricevuto l'errore del linker. Per Windows CE, la lib di collegamento richiesta è corelibc.lib .