2009-03-01 11 views
20

क्या दृश्य स्टूडियो को सभी प्रतीकों को एक lib फ़ाइल से डीएल में जोड़ने के लिए मजबूर करने का कोई तरीका है क्योंकि यह "अप्रयुक्त" फ़ंक्शंस को अनुकूलित करने के लिए प्रोग्राम द्वारा आवश्यक है रन समय पर डीएलएल।एक सिंब फ़ाइल में सभी प्रतीकों को जोड़ने के लिए दृश्य दृश्य स्टूडियो

मैंने/ओपीटी: एनओआरएफ और/ओपीटी: एनओआईसीएफ का उपयोग करने की कोशिश की लेकिन वे काम नहीं कर रहे हैं।

कारण मुझे उनकी आवश्यकता है क्योंकि वे वैश्विक वर्ग हैं जो उन्हें नियंत्रक के साथ स्वयं पंजीकृत करते हैं और उन्हें डीएलएल में जोड़ा नहीं जा रहा है।

+0

क्या आप संकलित और लिंक करने के लिए उपयोग की जा रही पूर्ण कमांड लाइन सूचीबद्ध कर सकते हैं? –

उत्तर

19

मुझे नहीं पता कि विजुअल स्टूडियो में एक और अधिक शानदार तरीका है, लेकिन क्रॉस-प्लेटफ़ॉर्म समाधान का उपयोग हम दो मैक्रोज़ के लिए करते हैं जो प्रोबलामैटिक ऑब्जेक्ट फ़ाइल को लिंक करने के लिए मजबूर करते हैं।

एक को उन कार्यों के स्रोत फ़ाइल में रखा गया है जिन्हें बाहर रखा जा रहा है, दूसरा एक फ़ंक्शन में रखा गया है जिसे लिंकर जानता है।

कुछ ऐसा;

#define FORCE_LINK_THIS(x) int force_link_##x = 0; 

#define FORCE_LINK_THAT(x) { extern int force_link_##x; force_link_##x = 1; } 

यह बिल्कुल सुरुचिपूर्ण नहीं है, लेकिन हमें प्लेटफार्मों में काम करने वाला एक बेहतर समाधान नहीं मिला है।

+0

बहुत प्यारा। '__declspec (dllexport)' पर्याप्त क्यों नहीं है? –

+1

'__declspec (dllexport)' और '__declspec (dllimport)' पर्याप्त नहीं हैं क्योंकि वे डीएलएल में कोड (कंपाइलर को) घोषित करते हैं। यह थंक-फ़ंक्शंस और .DEF-फ़ाइलें अनावश्यक बनाता है। बस एक मामूली अनुकूलन: '# परिभाषित करें FORCE_LINK_THAT (x) शून्य बल_लिंक_फंक्शन _ ## x (शून्य) {बाहरी int force_link _ ## x; force_link _ ## x = 1; } ' मैक्रो को उस फ़ाइल के शीर्ष पर रखा जा सकता है जिससे आप जानते हैं कि यह लिंक होगा। यह बीटीडब्ल्यू में कोई फर्क नहीं पड़ता कि डमी-फ़ंक्शन कभी नहीं कहा जाता है। –

+1

एक खाली शरीर के साथ एक समारोह के साथ काम करने लगता है। इसे निष्पादन योग्य या डीएल में बस किसी जगह पर कॉल करें जिसे आप lib में जोड़ रहे हैं। – BigSandwich

0

डीएलएल रनटाइम पर आपके lib से फ़ंक्शंस को कॉल करने जा रहा है? यह विश्वास करने के लिए थोड़ा मुश्किल लगता है।

अब DLL के उपयोगकर्ता आपके पुस्तकालय कार्यों को कॉल करने जा रहे हैं, तो आपका प्रश्न समझ में आता है। विंडोज कंपाइलर्स (यूनिक्स कंपाइलर्स के विपरीत) अगर स्पष्ट रूप से अनुरोध किया गया है तो केवल डीएलएल से निर्यात कार्यों को निर्यात करें। ऐसा करने का सबसे आम तरीका फ़ंक्शन "dllexport" घोषित करना है, लेकिन आप लिंकर को पास करने के रूप में .DEF फ़ाइल में फ़ंक्शंस का नाम भी दे सकते हैं। ध्यान दें कि आपको .DEF फ़ाइल में C++ उलझन वाले नाम को सूचीबद्ध करने की आवश्यकता है।

+0

क्योंकि वे वैश्विक वर्ग हैं जो उन्हें एक नियंत्रक के साथ खुद को regs और वे डीएल में जुड़े नहीं जा रहे हैं। – Lodle

+0

प्रश्न में इसे रखने के लिए उपयोगी होगा। यह एक अच्छा सवाल है, उस अतिरिक्त के साथ, लेकिन अब आपने जो पूछा उससे अलग है। – MSalters

1

मुझे एक प्लगइन सिस्टम के साथ एक ही समस्या थी, जहां विभिन्न डीएलएल में कारखानों का उपयोग एक आम मुख्य कारखाना का उपयोग कर रहा था, लाइब्रेरी लोड करते समय स्टार्टअप पर पंजीकृत सबकुछ, बिना प्लगइन की सूची को संकलित करने के लिए कठोर परिश्रम किए। यह लिनक्स के तहत बहुत अच्छी तरह से काम कर रहा था लेकिन विंडोज़ के तहत दो समस्याएं थीं:

  1. डीएलएल के बीच फैक्ट्रियां आम नहीं थीं। यह आपकी समस्या नहीं है लेकिन यह संबंधित है। मुझे यहां एक समाधान मिला: Ensuring to use common fatories। Set_the_global फ़ंक्शन के साथ जेम्स द्वारा उत्तर को देखें।
  2. यदि वे मुख्य में डीएलएल का कोई प्रतीक उपयोग नहीं करते थे तो वे स्टार्टअप पर सेटअप नहीं किए गए थे। मुझे लगता है कि यह आपकी समस्या है। मुझे मिला एकमात्र समाधान प्लगइन (डीएलएल) के नाम सूचीबद्ध करने और कॉन्फ़िगरेशन फ़ाइलों (उपप्रोजेक्ट द्वारा एक) का उपयोग करना था और मेरे मामले में QLibrary का उपयोग करके उनके लिंकिंग को मजबूर करना था। cmake का उपयोग करना, प्रत्येक subproject के लिए एक विन्यास फाइल का डिफ़ॉल्ट संस्करण निम्न मैक्रो का उपयोग निर्माण समय में उत्पन्न होता है, प्रत्येक प्लगइन निर्देशिका में add_library के बजाय कहा जाता है:

    file(WRITE ${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME}-plugins "") 
    macro (DECLARE_AMOSE_PLUGIN _plugin) 
        file (APPEND ${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME}-plugins "${_plugin}\n") 
        add_library(${_plugin} SHARED ${${_plugin}_LIB_SRCS}) 
    endmacro (DECLARE_AMOSE_PLUGIN) 
    
0

मैं एक pragma इस्तेमाल किया, यह लगता है काम करते हैं, लेकिन यदि आप लाइन शामिल नहीं करते हैं तो चकित नहीं होते हैं।

#include "library1.h" 
#include <QApplication> 
#pragma comment(lib, "C:\\Qt\\5.5\\msvc2013_64\\lib\\Qt5Guid.lib") 
PHI_STATUS PHI_EXP_CONV PHI_ShowGUI(size_t reserved) 
{ 
    QApplication app(none, nullptr); 
    ... 
} 

तुम भी Librarian टैब में Additional Dependencies क्षेत्र के माध्यम से उन्हें लिंक कर सकते हैं।

3

वास्तव में इसका आधा आधिकारिक समाधान है, और here it is है।

टी एल; डॉ:

'का प्रयोग करें पुस्तकालय निर्भरता आदानों'

वीएस लिंगो 'लाइब्रेरी निर्भरता इनपुट' में एक पुस्तकालय का गठन करने वाली ओबीजे फाइलों का नाम है। आप वास्तव में दो स्कोप में इस व्यवहार को नियंत्रित कर सकते हैं:

  1. प्रति refernce: द्वारा संदर्भ गुण में कॉम्बो 'पुस्तकालय निर्भरता जानकारी का उपयोग'। यह वह समाधान है जिसका मैंने व्यक्तिगत रूप से का उपयोग किया था, और एक ने in the post का उल्लेख किया था। Use Library Dependency Inputs

  2. प्रति पूरे निष्पादन

    : exe परियोजना में गुण/C++/लिंकर/जनरल/उपयोग पुस्तकालय निर्भरता आदानों -> हाँ

इन रहस्यमय सेटिंग्स के लिए ऐतिहासिक प्रेरणा enabling incremental linking in places it wasn't available before है, लेकिन यह एक lib में पैक की गई obj फ़ाइलों के खिलाफ सीधे जोड़ने का उपयोगी साइड इफेक्ट है, जिससे अपरिवर्तित वैश्विक ऑब्जेक्ट्स भी बनाते हैं।

0

MSVC2k17 में परीक्षण किया गया ...

__pragma(comment(linker,"/export:REGISTERfunc")); 
void REGISTERfunc() { printf("I'm linked!\n"); } 

पूरी तरह से काम करता है। यह एक स्थिर रूप से जुड़े .lib के अंदर भी हो सकता है और निष्पादन योग्य और उससे बाहर आउटपुट के लिए सभी तरह से चला जाएगा!

संपादित करें: आप इसे बोनस भयानक बिंदुओं के लिए मैक्रो में भी डाल सकते हैं!

संपादित करें: एक और नोट: आपको लिंक-टाइम कोड जनरेशन सक्षम होना चाहिए।/एलटीसीजी ... कुछ

संबंधित मुद्दे