2012-01-24 21 views
7

dopo l'aggiornamento a Ubuntu 11.10, ho scoperto che molti dei miei vecchi e attuali sviluppi non possono più essere compilati. Ho ridotto il problema ad un semplice esempio:Problemi di linker in Ubuntu 11.10

#include <X11/Xlib.h> 

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

    return 0; 
} 

compilazione utilizzando:

g++ -lX11 test.cpp 

o

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

causa un errore per accadere:

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

Qualche idea? Ho scoperto che alcune cose linker è cambiato in 11.10:

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

Ma ancora non spiega questi problemi.

+0

È necessario aver installato il pacchetto dev di X11 libx11-dev in precedenza. – boto

+4

@boto Lo so. In realtà, il problema era nell'ordine dei parametri. Ubuntu 11.10 contiene GCC 4.6.1, che apparentemente introduce vincoli di ordinamento dei parametri più stringenti. g ++ test.cpp -lX11 funziona bene. – cyberguijarro

+0

Ora vediamo come posso far funzionare SCons ... – cyberguijarro

risposta

20

g++ -lX11 -o test test.o

Sopra comando è errato . Prova a modificare:

g++ test.o -lX11 

Spiegazione del perché l'ordine conta here.

Inoltre, non chiamare mai gli eseguibili test su UNIX.

+0

Chiamare un 'test' eseguibile è ok * se * (a) non si ha' .' nel proprio '$ PATH', e (b) lo si richiama come'./Test' piuttosto che 'test'. –

+0

Ma se entra nel PATH, gli script di shell che non hai mai sentito inizieranno a esplodere intorno a te e la tua macchina non sarà più la stessa. In realtà, la maggior parte delle shell ha un test con nome incorporato, e molti script preferiscono usare '[' di questi tempi, quindi potrebbe accadere che non succeda nulla ... forse. – ams

+2

Se si utilizza make, è possibile impostare CC, CFLAGS, LDFLAGS e LDLIBS. LDLIBS = -lX11 in questo caso fa la cosa giusta, quindi "foo: foo.o" diventa: 'cc foo.o -lX11 -o foo' –

Problemi correlati