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
Avez-vous vérifié que 'surface' est un pointeur valide? – NathanOliver
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
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? –