DLL बनाने के लिए कई.libs लिंक करना: अनसुलझे बाहरी प्रतीक_DllMainCRTS स्टार्टअप




build linker (3)

मैं खिड़कियों पर 3.3 LLVM के निर्माण का (भयानक) काम कर रहा हूं और मुझे मंच पर मिल गया है जहां मेरे पास LLVM*.lib फ़ाइलों का भार है। मैं उन्हें एक विशाल साझा डीएलएल में एक साथ जोड़ना चाहता हूं लेकिन संघर्ष कर रहा हूं (यह मेरी खिड़कियों पर सामग्री जोड़ने वाला पहला समय है)। मैंने कोशिश की:

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

लेकिन कोई फायदा नहीं हुआ। इसके साथ त्रुटियां:

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

इंटरनेट ने /DEFAULTLIB:corelib जोड़ने का सुझाव दिया /DEFAULTLIB:corelib स्विच, इसलिए मैंने ऐसा किया, लेकिन फिर भी इसमें समस्याएं हैं:

> 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'

मैं यह कैसे करु?

संपादित करें: मैं एक खाली DllMain को लागू करने और इसे से EmptyDllMain.obj बनाने से ऊपर समस्या को ठीक करने में कामयाब रहे:

#include <windows.h>

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

और फिर कोशिश कर रहा है:

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

लेकिन मैं जो डीएलएल प्राप्त करता हूं वह सिर्फ 8kb है - ऐसा लगता है कि एलएलवीएम पुस्तकालयों के कई मेगाबाइट्स को याद किया गया है! मैं उन्हें कैसे शामिल करूं?

EDIT2: मैंने Windows समस्या पर LLVM संकलन हल किया, इस दस्तावेज़ को गिटब पर देखें


प्रोजेक्ट गुणों पर "लिंकर-> इनपुट" से "विशिष्ट डिफ़ॉल्ट पुस्तकालयों को अनदेखा करें" से लीब फ़ाइलों को हटा दें


यदि आप मैन्युअल रूप से _DllMainCRTStartup , तो सुनिश्चित हो कि आपने इसे (घड़ी केस) सही ढंग से लिखा है। मेरे पास _DLLMainCRTStartup था और यह पकड़ने के लिए कुछ समय लगा कि मुझे अभी भी लिंकर त्रुटि क्यों मिली Windows CE के लिए, आवश्यक लिंक corelibc.lib है corelibc.lib


एक बार जब मैंने गलत प्लैटफ़ॉर्म सेट (एक x86 से x64) के साथ एक लिब को जोड़ने के दौरान यह किया था सुनिश्चित करें कि सभी LLVM * .lib का निर्माण और सही टूलचैन से जोड़ा गया है:

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

जो आपको कॉल करके मिलता है

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

मीट्रिक टन और एमडी सीआरटीएस मिश्रण करते समय भी मुझे इसी तरह की समस्याएं थीं, मैं आपको सलाह देता हूं कि आप चिपक जाएं

/MD (or /MDd for debug) 

जब एलएलवीएम * .lib (और अन्य बाहरी पुस्तकालयों में से किसी भी अन्य ऑब्जेक्ट्स को आप इन में लिंक करते हैं) के लिए ऑब्जेक्ट संकलित करते हैं

[संपादित करें]

और उस बदसूरत EmptyDllMain.obj को निकाल दो!

[/ संपादित करें]