c++ - एमएसवीसी नाम मैंगलिंग



visual-c++ linker (1)

मैं एमएसवीसी 2015 x86 के साथ लुआ और क्यूटीला का निर्माण करने की कोशिश कर रहा हूं और निर्यात / आयातित प्रतीकों के साथ मुझे एक समस्या का सामना करना पड़ा है।

लुआ 5.3.2 ( स्रोत ) के लिए मैं क्या कर रहा हूं:

cl /MD /O2 /c /DLUA_BUILD_AS_DLL *.c
ren lua.obj lua.o
ren luac.obj luac.o
link /DLL /IMPLIB:lua5.3.2.lib /OUT:lua5.3.2.dll *.obj 
link /OUT:lua.exe lua.o lua5.3.2.lib 
lib /OUT:lua5.3.2-static.lib *.obj
link /OUT:luac.exe luac.o lua5.3.2-static.lib

अब तक यह काम करता है और निर्भरता वॉकर से पता चलता है कि फ़ंक्शन किसी भी प्रकार की नकल के बिना निर्यात किया जाता है।

तो मैं क्यूटेलिया का उपयोग कर सेमीकॉम का निर्माण कर रहा हूं और I'v को लगभग 100 त्रुटियों की तरह मिला है:

error LNK2019: unresolved external symbol _lua_close referenced in function "public: virtual __thiscall QtLua::State::~State(void)" (??[email protected]@@[email protected])

तो मूल रूप से मेरी समस्या यह है कि DLL निर्यात lua_close और linker _lua_close लिए दिखता है।

_lua_close प्रारूप को खोजते समय थोड़ा सा कानूनी लगता है क्योंकि माइक्रोसॉफ्ट प्रलेखन कहते हैं कि __cdecl साथ __cdecl सी प्रतीकों को बुलाया जाता है __cdecl '_' उपसर्ग से __cdecl जाता है

हालांकि मुझे ये नहीं मिलता है कि DLL निरस्त नामों से क्यों निर्यात करता है

लुआ (सी फाइलें) में संकलित होने पर फ़ंक्शन की घोषणा

__declspec(dllexport) void (lua_close) (lua_State *L);

फ़ंक्शन डिक्लेरेशन जब क्यूटीला में संकलित (सी ++ फ़ाइलें)

extern "C" {
  extern void (lua_close) (lua_State *L);
}

शीघ्र जवाब

एमएसवीसी को लावा डीएलएल (या लिब) नहीं मिला

लंबा जवाब

__cdecl का उपयोग करते हुए निर्यात किए गए C फ़ंक्शंस गड़बड़ी नहीं हैं, जबकि __cdecl का उपयोग करते हुए आंतरिक सी फ़ंक्शंस '_' उपसर्ग से उलझा हुआ है

स्रोत: http://wyw.dcweb.cn/stdcall.htm

मेरी समस्या को ठीक करने के लिए मैंने क्यूटीला से सभी स्रोत फाइलें लीं और उनसे एक क्यूमेक प्रोजेक्ट बनाया। और तादा! यह काम करता हैं! (खैर, ऐसा नहीं है क्योंकि क्यूटीएलआइ जीसीसी की तुलना में कुछ और नहीं है, लेकिन मैं इस लिंकर समस्या से छुटकारा पा रहा हूं)।

मेरा निष्कर्ष यह है कि:

  • _function शिकायत करता है कि _function नहीं है और वास्तव में function (या शायद दोनों) की तलाश में है
  • सीमके, भले ही उसे कॉन्फिग समय पर लुआ लाइब्रेरी मिल गई, लिंकर को बिल्ड समय पर उचित विकल्प देने में विफल रहे।