2015-09-03 5 views
31

मैं सिर्फ कैसे मैं त्रुटिकोई एहसास वर्ग प्रक्रिया परिभाषित

का हल पाया साझा करना चाहते हैं कोई एहसास वर्ग प्रक्रिया परिभाषित

जब एक एक्स/मोटिफ सी आवेदन चल रहा है। मैं इसे पोस्ट कर रहा हूं क्योंकि ऑनलाइन खोज करते समय मुझे केवल इस समस्या का एक संदर्भ मिला, और इसमें कोई समाधान नहीं था।

मैं समस्या को हल करने में कामयाब रहे और मेरी जानकारी को साझा करने अगर आप इस समस्या का सामना करना फिर से आते हैं चाहता था (नोटिस: मैं नहीं कह रहा हूँ मेरी समाधान हमेशा इस प्रकार की त्रुटि का समाधान होगा)।

समस्या

मैं एक साधारण सी प्रोग्राम है जो रूपांकन और एक्स intrinsics उपकरणकिटें इस्तेमाल किया चलाते समय इस समस्या पाया।

#include <stdio.h> 
#include <Xm/Xm.h> 
#include <Xm/PushB.h> 

/* Prototype Callback function */ 
void pushed_fn(Widget, XtPointer, XmPushButtonCallbackStruct *); 

int main(int argc, char **argv) 
{ 
    Widget top_wid, button; 
    XtAppContext app; 
    Display* display; 

    XtToolkitInitialize(); 
    app = XtCreateApplicationContext(); 
    display = XtOpenDisplay(app, "localhost:10.0","push","push", NULL,0, &argc,argv); 
    top_wid = XtAppCreateShell(NULL, "Form", applicationShellWidgetClass, display, NULL, 0); 

    button = XmCreatePushButton(top_wid, "Push_me", NULL, 0); 

    /* tell Xt to manage button */ 
    XtManageChild(button); 

    /* attach fn to widget */ 
    XtAddCallback(button, XmNactivateCallback, (XtCallbackProc) pushed_fn, NULL); 

    XtRealizeWidget(top_wid); /* display widget hierarchy */ 
    XtAppMainLoop(app); /* enter processing loop */ 
    return 0; 
} 

void pushed_fn(Widget w, XtPointer client_data, XmPushButtonCallbackStruct *cbs) 
{ 
    printf("Don't Push Me!!\n"); 
} 

उत्तर

28

मैं संदिग्ध समस्या के बाद से XtRealizeWidget प्रतीक है कि पुस्तकालय में परिभाषित किया गया है libXt पर हो सकता है:

$ gcc -Wall -c push.c 
$ gcc -Wall -o push push.o -lXt -lXm 
$ ./push 
Error: No realize class procedure defined 

सी स्रोत कोड निम्नलिखित था। मैं इसे देखा एनएम का उपयोग कर, लेकिन सब कुछ ठीक लग रहा था:

$ nm -D /usr/lib/libXt.so |grep XtRealizeWidget 
02b39870 T XtRealizeWidget 

"टी" का मतलब प्रतीक वस्तु फ़ाइलों कि libXt पुस्तकालय रचना का पाठ (कोड) खंड में है, इसलिए इस प्रतीक परिभाषित किया गया है। सिस्टम पुस्तकालयों का मार्ग भी सही था और मेरे पास केवल libXt का एक संस्करण था।

मैं तो सोचा था कि जिस क्रम में पुस्तकालयों जीसीसी लिंकर को पारित किया जा रहा था कारण हो सकते हैं और इसके बारे में पढ़ने, इस stackoverflow thread

पर समाप्त करने के लिए पुस्तकालयों के आदेश स्विच करने के बाद शुरू कर दिया:

$ gcc -Wall -o push push.o -lXm -lXt 

समस्या हल हो गई थी।

उस ऑर्डर पर ध्यान दें जिसमें पुस्तकालयों और लिंकर को पास किया जा रहा है!

+1

हालांकि मैं एक्स 11/मोटीफ प्रोग्रामिंग मैनुअल के सटीक संदर्भ नहीं ला सकता हूं, मुझे यकीन है कि कई मैनुअल/ट्यूटोरियल इसे सीधे रखते हैं: 'lXm' को' lXt' और 'lX11' से पहले जोड़ा जाना चाहिए। कम से कम, * LessTif * FAQ में संबंधित [नोट] (http://lesstif.sourceforge.net/FAQ.html#QU3.0) है। यह डेबियन [बग रिपोर्ट] भी देखें (https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=718691) (उनमें से बहुत सारे हैं)। – Bass

1

मार्टिन सीमन्स द्वारा जवाब (LessTif FAQ से लिया गया):

जोड़ने के क्रम समस्याओं इन दो प्रतीकों के कारण होता है:

vendorShellClassRec 
vendorShellWidgetClass 

जो परिभाषित कर रहे हैं और दोनों में संदर्भित -lXm और -lXt। किसी भी तरह आपको -lXm और -lXt दोनों में संदर्भों को पूरा करने के लिए -lXm परिभाषाओं का उपयोग करने के लिए लिंकर को मनाने के लिए है। -lXt परिभाषाओं का उपयोग नहीं किया जाना चाहिए। ठेठ एल्फ-आधारित गतिशील लोडर (लिनक्स, सोलारिस इत्यादि) के लिए, यह '-lXm -lXt' को लिंकर पर पास करके किया जाता है, जो उन्हें निष्पादन योग्य में SO_NEEDED अनुभागों के रूप में जोड़ता है।रनटाइम पर, डायनामिक लोडर प्रत्येक SO_NEEDED सेक्शन को उस क्रम में एकत्रित करता है, जो इसे पहले से जानता है, और फिर उस प्रतीक प्रतीक तालिका का उपयोग करके सभी भारित पुस्तकालयों में संदर्भों को ठीक करता है। ठेठ स्थिर लिंकर्स के लिए, यह लिंकर को '-lXm -lXt' निर्दिष्ट करके भी किया जाता है। इस मामले में, लिंकर -lXm से .o के कुछ निष्कर्ष निकालता है जिसमें उपयोगकर्ता-संदर्भित प्रतीक होते हैं और अंततः में आंतरिक संदर्भों के कारण -lXm:Vendor.o निकालने के समाप्त होते हैं। यह -lXt के लिए भी ऐसा ही करता है, लेकिन -lXt:Vendor.o निकालने की आवश्यकता नहीं है क्योंकि यह अभी भी अपरिभाषित कुछ भी परिभाषित नहीं करता है।

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