2013-07-18 4 views
7

Sto eseguendo il (terrificante) compito di compilare LLVM 3.3 su Windows e sono arrivato allo stage dove 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:Collegamento di molti .libs per creare una DLL: simbolo esterno non risolto _DllMainCRTStartup

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

ma senza alcun risultato. gli 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 suggerito di aggiungere l'interruttore /DEFAULTLIB:corelib, così ho fatto che ancora una volta, ma 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 posso fare questo?


EDIT: sono riuscito a risolvere il problema precedente, attuando un vuoto DllMain e fare EmptyDllMain.obj da esso:

#include <windows.h> 

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

e poi cercando:

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 il problema di Windows, date un'occhiata a questo document on github.

risposta

2

L'ho avuto una volta mentre collegavo una libreria con una piattaforma errata insieme (da X86 a X64). Assicurarsi che tutte le LLVM * .lib sono costruiti e collegati con la corretta toolchain:

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

che si ottiene chiamando

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

Inoltre ho avuto problemi simili durante la miscelazione MT e MD CRT, vi consiglio ti infili a

/MD (or /MDd for debug) 

durante la compilazione degli oggetti per una delle LLVM * lib (e qualsiasi altro oggetto da altre librerie esterne si collega in questi).

[modifica]

e calci che brutto EmptyDllMain.obj!

[/ modifica]

2

Se è stato immesso manualmente il _DllMainCRTStartup, essere sicuri di aver scritto che (guarda caso,) in modo corretto. Avevo _DLLMainCRTStartup e ho impiegato un po 'per capire perché ho ancora ricevuto l'errore del linker. Per Windows CE, la lib di collegamento richiesta è corelibc.lib.

+0

risposta eccellente, ma che cosa è la libreria per Visual C++ 6.0 e sotto * (corelibc ha un altro nome) *? – user2284570

0

rimuovere i file lib da "ignorare le librerie predefinite specifiche" da "Linker-> Input" sulle proprietà del progetto