2012-01-24 15 views
7

después de actualizar a Ubuntu 11.10, he descubierto que muchos de mis desarrollos antiguos y actuales ya no se pueden compilar. He reducido el problema a un ejemplo sencillo:Problemas del enlazador en Ubuntu 11.10

#include <X11/Xlib.h> 

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

    return 0; 
} 

Compilarlo usando:

g++ -lX11 test.cpp 

o

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

provoca una falta de suceder:

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

¿Algunas ideas? He encontrado que algunas cosas enlazador ha cambiado en 11.10:

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

Pero todavía no explica estos problemas.

+0

Debería haber instalado antes el paquete de desarrollo X11 libx11-dev. – boto

+4

@boto Lo sé. En realidad, el problema estaba en el orden de los parámetros. Ubuntu 11.10 incluye GCC 4.6.1, que aparentemente introduce restricciones de ordenamiento de parámetros más estrictas. g ++ test.cpp -lX11 funciona bien. – cyberguijarro

+0

Ahora veamos cómo puedo hacer que SCons trabaje alrededor de eso ... – cyberguijarro

Respuesta

20

g++ -lX11 -o test test.o

Por encima de comando es incorrecta . Tal vez puedas probar:

g++ test.o -lX11 

Explicación de por qué el orden importa here.

Además, nunca debe llamar a sus ejecutables test en UNIX.

+0

Llamar a una 'prueba 'ejecutable está bien * si * (a) no tiene' .' en su '$ PATH', y (b) lo invoca como'./Test' en lugar de 'test'. –

+0

Pero si se pone en PATH, las secuencias de comandos de shell que nunca has escuchado comenzarán a explotar a tu alrededor y tu máquina nunca volverá a ser la misma. En realidad, la mayoría de las shells tienen una prueba con nombre incorporada, y muchos scripts prefieren usar '[' en estos días, por lo que es posible que no pase nada ... tal vez. – ams

+2

Si usa make, puede configurar CC, CFLAGS, LDFLAGS y LDLIBS. LDLIBS = -lX11 en este caso hace lo correcto, por lo que "foo: foo.o" se convierte en: 'cc foo.o -lX11 -o foo' –

Cuestiones relacionadas