2012-01-24 6 views
7

après la mise à niveau vers Ubuntu 11.10, j'ai constaté que beaucoup de mes développements anciens et actuels ne peuvent plus être compilés. J'ai réduit le problème à un exemple simple:Problèmes de liaison dans Ubuntu 11.10

#include <X11/Xlib.h> 

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

    return 0; 
} 

à l'aide Compiler:

g++ -lX11 test.cpp 

ou

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

provoque une défaillance de se produire:

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

Des idées? J'ai trouvé que des trucs éditeur de liens a changé 11,10:

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

Mais n'explique pas ces problèmes.

+0

Vous devriez avoir installé le paquet de développement X11 libx11-dev avant. – boto

+4

@boto Je le sais. En fait, le problème était dans l'ordre des paramètres. Ubuntu 11.10 embarque GCC 4.6.1, qui introduit apparemment des contraintes d'ordre plus strictes. g ++ test.cpp -lX11 fonctionne correctement. – cyberguijarro

+0

Voyons maintenant comment je peux faire fonctionner les SCons ... – cyberguijarro

Répondre

20

g++ -lX11 -o test test.o

commande ci-dessus est incorrecte . Essayez ceci:

g++ test.o -lX11 

Explication des raisons pour lesquelles l'ordre des questions here.

De même, vous ne devez jamais appeler vos exécutables test sous UNIX.

+0

Appeler un exécutable 'test' est ok * si * (a) vous n'avez pas' .' dans votre '$ PATH', et (b) vous l'appelez'./Test' plutôt que 'test'. –

+0

Mais si cela arrive sur le PATH, les scripts shell dont vous n'avez jamais entendu parler commenceront à exploser autour de vous et votre machine ne sera plus jamais la même. En fait, la plupart des shells ont un test nommé intégré, et de nombreux scripts préfèrent utiliser '[' ces jours-ci, donc il se peut que rien ne se passe ... peut-être. – ams

+2

Si vous utilisez make, vous pouvez définir CC, CFLAGS, LDFLAGS et LDLIBS. LDLIBS = -lX11 dans ce cas fait la bonne chose, donc "foo: foo.o" devient: 'cc foo.o -lX11 -o foo' –

Questions connexes