2015-08-12 1 views
0

Snippet from Recompiling libiconv, gettext undefined symbols occurring after an already successful install ; thought to make it its own question.Lors de l'installation d'une bibliothèque est-il l'un de `ar`,` libtool`, `ranlib`, ou autre qui décide si c'est 32 ou 64 bits?

Essayer d'utiliser libiconv dans un fichier .c simple:

#include <iconv.h> 
// works: gcc -m32 -I/usr/local/include -liconv -o test-iconv.exe test-iconv.c 
// does NOT work: gcc -I/usr/local/include -liconv -o test-iconv.exe test-iconv.c 
int main(int argc, char **argv) { 
    iconv_t conv = iconv_open("ISO8859-1", "UTF-8"); 
    if (conv != (iconv_t) -1) { 
    return 0; 
    } 
    return 1; 
} 

Si je ne spécifie pas -m32 pour gcc je reçu l'erreur suivante:

$ gcc -I/usr/local/include -liconv -o test-iconv.exe test-iconv.c 
Undefined symbols for architecture x86_64: 
    "_libiconv_open", referenced from: 
     _main in ccr9tTic.o 
ld: symbol(s) not found for architecture x86_64 
collect2: ld returned 1 exit status 
+0

Vous passez '-m32' à ** gcc **, comment cela ne répond-il pas déjà à votre question? –

+0

Désolé, j'essaie de garder le reste des programmes 64bit. 'libiconv' est l'une de leurs dépendances –

Répondre

0

Lorsque vous 'installer' un bibliothèque, la bibliothèque a déjà été créée et l'installation ne peut pas changer s'il s'agit d'une bibliothèque 32 bits ou 64 bits. Ce qui contrôle si une bibliothèque est pour 32 bits ou 64 bits (ou les deux, si vous utilisez MacOS Sierra ou Mac OS X) est la façon dont les fichiers objet sont compilés. Si vous compilez avec gcc -m32, les fichiers objet seront 32 bits et la bibliothèque sera 32 bits; Si vous compilez avec -m64, ils seront en 64 bits. Si vous compilez sans aucune option, vous obtiendrez un comportement par défaut, et la valeur par défaut dépend de la plate-forme et de la manière dont le compilateur a été construit. Si vous utilisez l'un des systèmes d'exploitation Mac, il est possible de compiler les versions 32 bits et 64 bits en un seul fichier objet, puis de créer une bibliothèque contenant à la fois 32 bits et 64 bits. Par la suite, vous devez vous assurer que vous avez compilé libiconv avec les options 64 bits. Vous devrez peut-être utiliser ./configure CC='gcc -m64' CXX= g ++ -m64 ou quelque chose de similaire pour forcer des compilations 64 bits - c'est un truc que j'utilise parfois.

+0

Je suppose que le problème principal que j'avais était mon système était censé seulement 32 bits (le système d'exploitation). Pourquoi aurais-je des problèmes avec la compilation si le système d'exploitation était déjà en 32 bits mais que le programme 'libiconv' avait des problèmes de compilation pour" architecture x86_64 " –