2015-10-21 4 views
0

je la routine suivante pour prendre une capture d'écran:faute Seg caire lors de l'utilisation des bibliothèques statiques

void take_screenshot(const std::string & file_name) 
{ 
    Display *disp; 
    Window root; 
    cairo_surface_t *surface; 
    int scr; 

    disp = XOpenDisplay(nullptr); 
    scr = DefaultScreen(disp); 
    root = DefaultRootWindow(disp); 

    surface = cairo_xlib_surface_create(disp, root, DefaultVisual(disp, scr), 
         DisplayWidth(disp, scr), 
         DisplayHeight(disp, scr)); 
    cairo_surface_write_to_png(surface, file_name.c_str()); // <-- here is the seg fault 
    cairo_surface_destroy(surface); 
} 

Cette routine a été prise de la réponse de https://stackoverflow.com/users/436275/uli-schlachter à cette question Making a screenshot using Xlib and Cairo libs [fail] (crédits aux auteurs)

La routine fait partie d'un programme appelé collector. qui est lié comme suit:

clang -o collector -g -O2 -fno-strict-aliasing collector.o common-vars.o \ 
collector-events.o listeners.o active_window.o \ 
../lib/libperfq-common.a -lPocoNet -lPocoFoundation -luiohook\ 
-lstdc++ -lgsl -lgslcblas -lm -lcairo -lXt -lXtst -lXinerama \ 
-lX11 -lpthread -lc 

Jusqu'ici tout va bien. Le programme fonctionne très bien. Cependant, lorsque je lier statiquement les bibliothèques poco et uiohook, le programme lance un défaut seg sur la ligne indiquée ci-dessus.

L'exécutable avec poco et bibliothèques uiohook liés statiquement est produit comme suit:

clang -o collector -g -O2 -fno-strict-aliasing collector.o \ 
common-vars.o collector-events.o listeners.o active_window.o \ 
../lib/libperfq-common.a /home/lrleon/poco/lib/libPocoNet.a \ 
/home/lrleon/poco/lib/libPocoFoundation.a \ 
/home/lrleon/uiohook/lib/libuiohook.a -lstdc++ -lgsl -lgslcblas \ 
-lm -lcairo -lXt -lXtst -lXinerama -lX11 -lpthread -lc 

Avec cette version, j'ai une erreur de segmentation. Et après avoir changé certaines bibliothèques dynamiques, regarder avec un débogueur, je sais ce qui cause l'erreur.

Je suppose que le fait que certaines bibliothèques sont chaînées en mode statique fait échouer l'appel à cairo_surface_write_to_png(). Mais je n'ai aucune idée pourquoi.

Une idée? Merci d'avance

+0

Avez-vous vérifié que 'surface' est un pointeur valide? – NathanOliver

+0

Oui! Il est valide dans le sens où il n'est pas NULL et pointe vers une adresse lisible. Plus sur sa validité, je suis incapable de dire parce que je ne connais pas le caire. Cependant, je remarque que ce code fonctionne parfaitement lorsque toutes les bibliothèques sont liées dynamiquement – lrleon

+0

Etes-vous sûr que le programme a un accès en écriture à un fichier nom_fichier et que ce fichier n'est pas ouvert dans une autre application? –

Répondre

1

J'ai juste corrigé un crash sur linux à cause de xcb dans la branche 2.1. Cela peut résoudre votre problème lorsque 2.1.1. Je recommande d'essayer 2.0 qui ne contient pas xcb pour voir si cela résout votre problème.