2016-05-28 1 views
0

Un projet sur lequel je travaille construit cairo à partir de la source, appelant ses ./configure et make. J'utilise git-bash.exe à partir d'une installation PortableGit, avec des variables d'environnement d'un MinGW différent. J'ai donc:Référence non définie avec les symboles .gnu.lto_ existants dans la liaison statique? (cairo, mingw)

[email protected] MINGW32 /z/user/Downloads/path/to/build/cairo (master) 
$ which gcc 
//WORKGROUP.EX.COM/Users/user/Downloads/mingw-w64/i686-4.9.3-posix-dwarf-rt_v4-rev1/mingw32/bin/gcc 

[email protected] MINGW32 /z/user/Downloads/path/to/build/cairo (master) 
$ gcc --version | head -1 
gcc.exe (i686-posix-dwarf-rev1, Built by MinGW-W64 project) 4.9.3 

La compilation va bien, mais la liaison va mal ici:

[...] 
    CC  any2ppm-any2ppm.o 
    CCLD any2ppm.exe 
C:\Users\TEMPCR~1.000\AppData\Local\Temp\45\ccaKwhAD.ltrans0.ltrans.o:<artificial>:(.text+0x71): undefined reference to `cairo_image_surface_create' 
C:\Users\TEMPCR~1.000\AppData\Local\Temp\45\ccaKwhAD.ltrans0.ltrans.o:<artificial>:(.text+0x163): undefined reference to `cairo_image_surface_get_data' 
[...] 
makefile:483: recipe for target 'all' failed 
make: *** [all] Error 2 

^ Received error^

Malheureusement, make V=1 ne fonctionne pas pour ce Makefile pour révéler ses commandes, donc je une course sèche make -n pour obtenir la commande CCLD any2ppm.exe, qui est la suivante:

echo " CCLD " any2ppm.exe;Z:/user/Downloads/PortableGit/usr/bin/sh.exe ../libtool --silent --tag=CC --mode=link gcc  -Os -m32 -Wl,--allow-shlib-undefined -m32 -o any2ppm.exe any2ppm-any2ppm.o ../util/cairo-script/libcairo-script-interpreter.la ../src/libcairo.la  -lm 

... et en supprimant l'interrupteur --silent du ../libtool et re-exécution de la commande, le défaut de commande gcc réelle est (ligne mine de split):

# runs in /z/user/Downloads/path/to/build/cairo/test 
libtool: link: gcc \ 
-Os -m32 -Wl,--allow-shlib-undefined -m32 \ 
-o .libs/any2ppm.exe any2ppm-any2ppm.o \ 
../util/cairo-script/.libs/libcairo-script-interpreter.a \ 
Z:/user/Downloads/path/to/build/cairo/src/.libs/libcairo.a \ 
-LZ:/user/Downloads/path/to/build/_buildroot/lib ../src/.libs/libcairo.a \ 
/z/user/Downloads/path/to/build/_buildroot/lib/libpixman-1.a \ 
/z/user/Downloads/path/to/build/_buildroot/lib/libpng16.a \ 
-lgdi32 -lmsimg32 -lz -pthread 

Voici la chose - l'erreur de lien a "undefined reference to cairo_image_surface_get_data'`", mais si je vérifier:

[email protected] MINGW32 /z/user/Downloads/path/to/build/cairo/test (master) 
$ nm -a Z:/user/Downloads/path/to/build/cairo/src/.libs/libcairo.a | grep cairo_image_surface_get_data 
00000000 r .gnu.lto_cairo_image_surface_get_data.f85122d4 

... est est une sorte d'un symbole, sauf préfixe avec .gnu.lto_? J'ai trouvé Sourceware Bugzilla: 13557 – Undef. ref. err. when linking with slim LTO obj. in static lib. (mingw32 target), mais je suppose que ce correctif est déjà dans le compilateur que j'utilise (4.9.3)? J'ai également essayé d'inverser l'ordre des bibliothèques incluses sur la ligne de commande de liaison, cela ne fonctionnait pas non plus.

Donc, en bref, en libcairo.a qui est explicitement donnée avec le chemin complet correct à la ligne de commande gcc (et lié statiquement), il y a un .gnu.lto_cairo_image_surface_get_data.f85122d4, mais la liaison échoue avec « undefined reference to `cairo_image_surface_get_data' ». Pourquoi cela se produit-il, et comment puis-je obtenir la commande de liaison pour réussir?

(Ironie du sort, j'ai compilé caire avant dans le même git-bash.exe sur la même machine, mais il était sans doute un environnement MinGW différent - ne peut pas se souvenir vraiment)

Répondre