2012-01-24 8 views
7

में उबंटू 11.10 में अपग्रेड करने के बाद लिंकर की समस्याएं, मैंने पाया है कि मेरे पुराने और वर्तमान विकास में से कई को संकलित नहीं किया जा सकता है। मैं एक साधारण उदाहरण के लिए समस्या कम है:उबंटू 11.10

/tmp/ccBAOpzy.o: In function `main': 
test.cpp:(.text+0x11): undefined reference to `XOpenDisplay' 
test.cpp:(.text+0x21): undefined reference to `XCloseDisplay' 

:

g++ -lX11 test.cpp 

या

g++ -c -o test.o test.cpp 
g++ -lX11 -o test test.o 

होने की एक विफलता का कारण बनता है:

#include <X11/Xlib.h> 

int main() { 
    Display* display = XOpenDisplay(":0.0"); 
    XCloseDisplay(display); 

    return 0; 
} 

का उपयोग कर इसे संकलन कोई विचार? मैं पाया है कि कुछ लिंकर सामान 11.10 में बदल गया है:

https://wiki.ubuntu.com/NattyNarwhal/ToolchainTransition

लेकिन फिर भी इन समस्याओं की व्याख्या नहीं करता।

+0

आपको पहले X11 dev पैकेज libx11-dev स्थापित करना चाहिए था। – boto

+4

@boto मुझे पता है कि। असल में, समस्या पैरामीटर क्रम में थी। उबंटू 11.10 जहाज जीसीसी 4.6.1, जो स्पष्ट रूप से कठोर पैरामीटर ऑर्डरिंग बाधाओं को प्रस्तुत करता है। g ++ test.cpp -lX11 ठीक काम करता है। – cyberguijarro

+0

अब देखते हैं कि मैं स्कैन को उसके आसपास कैसे काम कर सकता हूं ... – cyberguijarro

उत्तर

20

g++ -lX11 -o test test.o

आदेश से ऊपर गलत है। ऐसा करें: क्यों आदेश मायने रखती है here की

g++ test.o -lX11 

स्पष्टीकरण।

इसके अलावा, आपको यूनिक्स पर अपने निष्पादन योग्य test कभी भी कॉल नहीं करना चाहिए।

+0

निष्पादन योग्य 'परीक्षण' को कॉल करना ठीक है * यदि * (ए) आपके पास '' PATH' में ''' नहीं है, और (बी) आप इसे' test' के बजाय '।/Test' के रूप में आमंत्रित करते हैं। –

+0

लेकिन अगर यह पैथ पर मिलता है, तो शेल स्क्रिप्ट जिन्हें आपने कभी नहीं सुना है, आपके चारों ओर विस्फोट करना शुरू कर देगा और आपकी मशीन कभी भी वही नहीं होगी। असल में, अधिकांश गोले में एक अंतर्निहित नाम परीक्षण होता है, और कई स्क्रिप्ट '[' इन दिनों का उपयोग करना पसंद करते हैं, इसलिए ऐसा हो सकता है कि कुछ नहीं होता .... हो सकता है। – ams

+2

यदि उपयोग करना है, तो सीसी, सीएफएलएजीएस, एलडीएफएलजीएस, और एलडीएलबीएस सेट कर सकते हैं। इस मामले में LDLIBS = -lX11 सही चीज करता है, इसलिए "foo: foo.o" बन जाता है: 'cc foo.o -lX11 -o foo' –

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