构建FTP4ALL:对“crypt”的未定义引用

时间:2013-12-24 12:15:33

标签: gcc

我知道 - 有很多像这样的问题 - 但找不到解决方案......

尝试在 CentOS 6 上安装 FTP4ALL 3.012。

/configure正常执行,但make - 返回错误:

f4adp_user.o: In function `f4adp_usr_pwd':
f4adp_user.c:(.text+0xfa0): undefined reference to `crypt'
f4adp_user.o: In function `f4adp_usr_chg':
f4adp_user.c:(.text+0x340e): undefined reference to `crypt'
f4adp_user.o: In function `f4adp_usr_adq':
f4adp_user.c:(.text+0x37a7): undefined reference to `crypt'
serverd.o: In function `user_request_login_permission':
serverd.c:(.text+0x2a9a): undefined reference to `crypt'
collect2: ld returned 1 exit status

Makefile仅包含:

$ cat Makefile | tail -n 15
all:
    @cd src ; make

strip:
    @cd src ; make strip

clean:
    @cd lib ; make clean
    @cd src ; make clean
    @cd cfg ; make clean
    @rm -f Makefile src/common/tweak.h src/common/Makefile src/Makefile src/ftpa/Makefile src/ftpd/Makefile src/ftps/Makefile

install:
    cp -f bin/* /usr/local/bin

我该如何解决?

2 个答案:

答案 0 :(得分:1)

您需要将-lcrypt添加到链接行,以便链接器在crypt中搜索crypt函数。

在普通的Unix工具链中,事情如下:

源代码(compiler) - >汇编代码(assembler) - > .o文件 - > (linker) - >可执行文件。

链接器是工具链的最后一部分,负责将所有函数组合成可执行文件。在Makefile中的某个地方,很可能是src子目录中的Makefile,会有一行告诉链接器在哪里可以找到所有.o文件和任何依赖库。那是你的链接线,它需要有-lcrypt才能找到crypt函数。

答案 1 :(得分:0)

仅关于FTP4ALL - 解决方案是:

$ vim ../../ftp/ftp4all/configure

其中ftp4all是目录,它是在:

之后创建的
$ tar xfp ftpd-3.012.tar.gz`

查找行:

echo $ac_n "| want DES encryption (y/n) ? $ac_c"

编辑:

else
  DES=""
  LIB=${LIB}
fi

要:

else
  DES=""
  LIB=${LIB}" -lcrypt"
fi

此外,在此之后 - 编译时出现了另一个错误:

common.c:52: error: conflicting types for ‘setenv’
/usr/include/stdlib.h:585: note: previous declaration of ‘setenv’ was here

解决方案:

$ vim ./src/ftps/common.c

评论/**/行:

#ifndef HAVE_SETENV
/*
void setenv(char* var, char* val, int new)
{ char str[256];

  sprintf(str,"%s=%s",var,val);
  putenv(str);
}
*/

#endif /* HAVE_SETENV */

现在 - 它有效。

P.S。请注意:

  

不再维护FTP4ALL。本网站仅供参考   目的。请访问后续项目OpenFTPD。

希望 - 没有其他人会尝试安装它: - )