gcc ne sera pas lié avec -m32

23

Essayer de compiler même le int main(){}programme le plus simple ( ) avec -m32sur un système 64 bits échoue:

$ gcc -m32 test.c
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.8/libgcc.a when searching for -lgcc
/usr/bin/ld: cannot find -lgcc
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.8/libgcc_s.so when searching for -lgcc_s
/usr/bin/ld: cannot find -lgcc_s
collect2: error: ld returned 1 exit status

Il semble que la recherche par erreur dans les mauvais répertoires -m32soit toujours spécifiée.

libgcc-4.8-dev:i386est installé et j'ai vérifié que les bibliothèques 32 bits se trouvent dans /usr/lib/gcc/i686-linux-gnu/4.8/.

J'ai essayé de définir et d'exporter LD_INCLUDE_PATHet LD_LIBRARY_PATHen vain.

Vladimir Panteleev
la source

Réponses:

23

Tout d'abord, vous devez installer "gcc-multilib" et "g ++ - multilib"

sudo apt-get install gcc-multilib g++-multilib

Ensuite, votre commande actuelle fonctionnera,

$ cat hello.c
#include <stdio.h>

int main(int argc, char *argv[]) {
    puts("Hello, World!");
}
$ uname -a
Linux vbox-1404 3.13.0-24-generic #46-Ubuntu SMP Thu Apr 10 19:11:08 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
$ gcc -m32 hello.c
$ ./a.out
Hello, World!
$ file a.out
a.out: ELF 32-bit LSB  executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=80bdc95e2941e3ba8d7bb7c1682098f20e77cebc, not stripped
Elliott Frisch
la source
2
Remarque: pour les programmes C ++, g++-multilibsera également requis.
Vladimir Panteleev
1
Considérez aussi: libc6-dev-i386.
kenorb
0

Pour réussir la compilation du code C en exécutables x86 32 bits dans un environnement x86_64, vous devez installer les packages supplémentaires suivants:

sudo apt-get install libc6-dev-i386 gcc-multilib

Après un appel de compilation comme

$ gcc -m32 test.c -o test

réussit.

maxschlepzig
la source
0

Ce problème se produit également lorsque la gccversion ne correspond pas à la version de gcc-multilib. Dans ce cas, vous devez installer la version correcte des packages multilib. Par exemple; J'utilisais la version gcc 4.6, j'ai donc dû installer gcc-4.6-multilibet g++-4.6-multilibparce que le gcc-multilibpackage par défaut était pour 4.8.

Salut toi
la source