Ошибка компилятора / связывания: Freedup - PullRequest
0 голосов
/ 08 декабря 2009

Я пытался скомпилировать программу для жесткой ссылки на дубликаты файлов под названием freedup. Я пытался написать автору / сопровождающему программы по электронной почте, но это было давно, и я ничего не получил от него.

Я пытаюсь скомпилировать программу из среды cygwin, используя последние стабильные версии gcc (3.4.4-999) и make (3.81-2). Я попытался удалить все объектные файлы и запустить make, но я всегда получаю следующую ошибку:

freedup.o: в функции 'main':
/home/[user]/freedup-1.5/freedup.c:1791: неопределенная ссылка на '_hashed'
collect2: ld вернул 1 статус выхода make: * * * [freedup] Ошибка 1

Я взглянул на исходный код и увидел, что «хэшированная» функция является встроенной функцией (которую я не думал, что ее нужно объявлять вне исходного файла ... но это только то, что я собрал некоторые предварительные поиски в Интернете).

Если кому-то будет любезно попробовать скомпилировать эту программу в среде Windows, и мне повезет, я был бы очень признателен. Спасибо

Прямая ссылка на исходные файлы: http://freedup.org/freedup-1.5-3-src.tgz

Ответы [ 2 ]

2 голосов
/ 08 декабря 2009

Я не впечатлен кодом, который использует '#include <linux/stat.h>' вместо '#include <sys/stat.h>'. Я также не впечатлен кодом, в котором файл version.h содержит:

-e #define VERSION "1.5-3"

(Этот файл генерируется командой - 'echo -e '#define...' > version.h'. Тьфу!)

Если вы измените функцию с:

inline int hashed(const char*s)
{
    int returnval=atoi(s);

    if(returnval>2) returnval=2;
    if(returnval<0) returnval=0;
    return returnval;
}

до:

static
inline int hashed(const char*s)
{
    int returnval=atoi(s);

    if(returnval>2) returnval=2;
    if(returnval<0) returnval=0;
    return returnval;
}

(и исправьте другие проблемы, упомянутые выше), затем он компилируется на MacOS X 10.6.2 с GCC «i686-apple-darwin10-gcc-4.2.1 (GCC) 4.2.1 (Apple Inc., сборка 5646) (точка 1)».

Тестовый код не выполняется в случайных точках, так как он предполагает касание в / bin / touch (в MacOS X это / usr / bin / touch). Есть также много предупреждений о «спецификаторах типов, игнорируемых в возвращаемом типе функции», так как «auto.h» определяет 4 функции как возвращающие «const int» (для различных типов «int»), а также в указателях функций в структуре в тот же заголовок.

Полагаю, это сводится к недостаточному опыту со стороны авторов - или к недостаточному количеству протестированных платформ. Команде version.h не нужно использовать вкладку (я считаю, что '-e' - это расширение нотации '\t' в командной строке - Makefile должен быть исправлен, чтобы пропустить '-e' и замените '\t' на простой пробел.

Поведение 'inline' в стандартном C99 интересно:

6.7.4 Спецификаторы функций

Синтаксис

функция спецификатор:

    inline

Ограничения

Спецификаторы функций должны использоваться только в объявлении идентификатора функции.

Встроенное определение функции с внешней связью не должно содержать определения изменяемый объект со статической продолжительностью хранения и не должен содержать ссылку на идентификатор с внутренней связью.

В размещенной среде спецификатор встроенной функции не должен появляться в объявлении основной.

Семантика

Функция, объявленная со спецификатором встроенной функции, является встроенной функцией. спецификатор функции может появляться более одного раза; поведение такое же, как если бы оно появилось только однажды. Создание функции как встроенной функции предполагает, что вызовы этой функции как можно быстрее. 118) Степень эффективности таких предложений реализации. 119)

Любая функция с внутренней связью может быть встроенной функцией. Для функции с внешним связи, применяются следующие ограничения: если функция объявлена ​​со встроенным спецификатор функции, то он также должен быть определен в той же единице перевода. Если все декларации области файла для функции в модуле перевода включают встроенную функцию спецификатор без extern, то определение в этой единице перевода является встроенным определение. Встроенное определение не предоставляет внешнего определения для функции, и не запрещает внешнее определение в другой единице перевода. Встроенное определение предоставляет альтернативу внешнему определению, которое переводчик может использовать для реализации любой вызов функции в том же модуле перевода. Не определено, является ли звонок Функция использует встроенное определение или внешнее определение. 120)

118) Используя, например, альтернативу обычному механизму вызова функции, такую ​​как ‘‘ inline замена»». Встроенная замена не является текстовой заменой и не создает новую функцию. Поэтому, например, расширение макроса, используемого в теле функции, использует определение, которое он имел в том месте, где появляется тело функции, а не там, где вызывается функция; а также идентификаторы ссылаются на объявления в области видимости тела. Аналогично, функция имеет один адрес, независимо от количества встроенных определений, которые встречаются в дополнение к внешнему определение.

119) Например, реализация может никогда не выполнять встроенную замену или может выполнять только встроенную замены вызовов в области действия встроенной декларации.

120) Поскольку встроенное определение отличается от соответствующего внешнего определения и от любого другого соответствующие встроенные определения в других единицах перевода, все соответствующие объекты со статическим хранилищем продолжительность также различна в каждом из определений.

0 голосов
/ 27 октября 2011

Джонатан Леффлер дает ответ для freedup 1.5.3: добавьте «static» или удалите «inline» в хешированной функции. (Вам, вероятно, следует принять этот ответ.)

freedup 1.6- * вообще не компилируется в Cygwin:

socket.c:20:26: fatal error: net/ethernet.h: No such file or directory

Этот файл не существует в Cygwin.

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