Unix C - Компиляция для 64-битных разрывов "dirname" - PullRequest
2 голосов
/ 29 октября 2010

Я использую dirname из libgen.h, чтобы получить путь к каталогу из пути к имени файла.

Это его подпись:

char * dirname (char *path)

При компиляции на 32-битной машине или использовании -m32 с gcc все работает нормально.

Мой код выглядит так:

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

Если я компилирую на 64-битной машине, я получаю предупреждение:

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

Это исправит предупреждение, но вылетает во время выполнения:

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

Я никогда раньше не пытался кросс-компилировать 32/64 бит, есть ли способ это исправить?

Ответы [ 2 ]

5 голосов
/ 29 октября 2010

Включаете ли вы заголовочный файл, содержащий определение для dirname (в моей системе это libgen.h, отметьте /usr/include)?

Предупреждение "cast to pointer from integer of different size" звучит так, как будто оно преобразуется из int, кода возврата по умолчанию для функций, прототип которых не определен.

Вероятно, происходит то, что ваши типы данных int и char * имеют одинаковый размер для 32-битного кода, но при переключении на 64-битные они на самом деле имеют разные размеры.

Вы можете проверить это, распечатав sizeof(int) и sizeof(char*) и посмотрев, отличаются ли они.

1 голос
/ 29 октября 2010

Вы не смогли предоставить прототип для dirname (либо включив libgen.h, либо создав его самостоятельно), поэтому он неявно получает тип int dirname();. Поскольку это не соответствует реальной функции, ваша программа имеет неопределенное поведение. (В этом случае верхняя половина указателя усекается.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...