2010-10-29 22 views
2

J'utilise dirname de libgen.h pour obtenir le chemin du répertoire à partir du chemin d'un nom de fichier.Unix C - Compilation pour des sauts de 64 bits "dirname"

C'est sa signature:

char * dirname (char *path) 

Lors de la compilation sur une machine 32 bits ou en utilisant -m32 avec gcc, tout fonctionne très bien.

Mon code ressemble à ceci:

char* path = "/path/to/my/file.txt"; 
char* path_cpy = strdup(path); 
const char* dir = (const char*)dirname(path_cpy); 

Si je compile sur une machine 64 bits, je reçois l'avertissement:

"warning: cast to pointer from integer of different size" 

Cela corrigera l'avertissement, mais se bloque lors de l'exécution:

const char* dir = (const char*)(uintptr_t)dirname(path_cpy); 

Je n'ai jamais essayé de compiler les versions 32/64 bits auparavant, est-il possible de résoudre ce problème?

Répondre

5

Incluez-vous le fichier d'en-tête qui inclut la définition de dirname (libgen.h sur mon système, vérifiez /usr/include)?

L'avertissement "cast to pointer from integer of different size" sonne comme s'il s'agissait d'un int, le code de retour par défaut des fonctions sans prototype défini. Il est probable que vos types de données int et char * ont la même taille pour le code 32 bits, mais lorsque vous passez à 64 bits, ils ont des tailles différentes.

Vous pouvez vérifier cela en imprimant sizeof(int) et sizeof(char*) et voir si elles sont différentes.

+0

Vous avez raison, cela a résolu mon problème. Je comprends pourquoi cela se briserait sur 64 bits. – jonathanpeppers

+0

Ce que je ne comprends pas, c'est pourquoi vous n'aviez pas, quelque part dans la sortie de votre Comile, quelque chose comme 'Undefined reference to dirname()'? – Gui13

1

Vous n'avez pas réussi à fournir un prototype pour dirname (soit en incluant libgen.h ou en le prototypant vous-même), donc il obtient implicitement le type int dirname();. Comme cela ne correspond pas à la fonction réelle, votre programme a un comportement indéfini. (Dans ce cas, la moitié supérieure du pointeur est tronquée.)