0

我一直在尝试编译一个用于硬链接重复文件的程序,称为 freedup。我确实尝试向程序的作者/维护者发送电子邮件,但已经很长时间了,我还没有收到他的任何回复。

我正在尝试使用最新稳定版本的 gcc (3.4.4-999) 和 make (3.81-2) 从 cygwin 环境编译程序。我尝试删除所有目标文件并运行 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

4

2 回答 2

2

我对使用 ' #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. build 5646) (dot 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

约束

函数说明符只能在函数标识符的声明中使用。

具有外部链接的函数的内联定义不应包含具有静态存储持续时间的可修改对象的定义,并且不应包含对具有内部链接的标识符的引用。

在托管环境中,内联函数说明符不应出现在 main 的声明中。

语义

使用内联函数说明符声明的函数是内联函数。函数说明符可能出现多次;行为就像它只出现一次一样。使函数成为内联函数意味着对函数的调用尽可能快。118)此类建议的有效程度由实施定义。119)

任何具有内部链接的函数都可以是内联函数。对于具有外部链接的函数,适用以下限制: 如果函数使用内联函数说明符声明,则它也应在同一翻译单元中定义。如果翻译单元中函数的所有文件范围声明都包含不带 extern 的内联函数说明符,则该翻译单元中的定义是内联定义。内联定义不为函数提供外部定义,也不禁止在另一个翻译单元中进行外部定义。内联定义提供了外部定义的替代方案,翻译器可以使用它来实现对同一翻译单元中函数的任何调用。120)

118)例如,通过使用通常的函数调用机制的替代方法,例如“内联替换”。内联替换不是文本替换,也不会创建新函数。因此,例如,在函数体中使用的宏的扩展使用它在函数体出现时的定义,而不是调用函数的位置;标识符指的是正文出现的范围内的声明。同样,该函数具有单个地址,而不管除外部定义之外出现的内联定义的数量。

119)例如,一个实现可能永远不会执行内联替换,或者可能只对内联声明范围内的调用执行内联替换。

120)由​​于内联定义不同于相应的外部定义和其他翻译单元中的任何其他相应的内联定义,所有具有静态存储持续时间的相应对象在每个定义中也是不同的。

于 2009-12-08T12:43:59.823 回答
0

Jonathan Leffler 为 freedup 1.5.3 提供了答案:在散列函数上添加“静态”或删除“内联”。(您可能应该接受这个答案。)

freedup 1.6-* 根本无法在 Cygwin 上编译:

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

Cygwin 中不存在此文件。

于 2011-10-27T14:59:10.480 回答