неопределенная ссылка на `crypt ' - PullRequest
8 голосов
/ 13 мая 2011

Я использую приведенный ниже код, который нашел где-то в сети, и получаю сообщение об ошибке, когда пытаюсь его собрать. Компиляция в порядке.

Вот ошибка:

/tmp/ccCnp11F.o: In function `main':

crypt.c:(.text+0xf1): undefined reference to `crypt'

collect2: ld returned 1 exit status

и вот код:

#include <stdio.h>
 #include <time.h>
 #include <unistd.h>
 #include <crypt.h>

 int main()
 {
   unsigned long seed[2];
   char salt[] = "$1$........";
   const char *const seedchars =
     "./0123456789ABCDEFGHIJKLMNOPQRST"
     "UVWXYZabcdefghijklmnopqrstuvwxyz";
   char *password;
   int i;

   /* Generate a (not very) random seed.
      You should do it better than this... */
   seed[0] = time(NULL);
   seed[1] = getpid() ^ (seed[0] >> 14 & 0x30000);

   /* Turn it into printable characters from `seedchars'. */
   for (i = 0; i < 8; i++)
     salt[3+i] = seedchars[(seed[i/5] >> (i%5)*6) & 0x3f];

   /* Read in the user's password and encrypt it. */
   password = crypt(getpass("Password:"), salt);

   /* Print the results. */
   puts(password);
   return 0;
 }

Ответы [ 4 ]

17 голосов
/ 13 мая 2011

crypt.c:(.text+0xf1): undefined reference to 'crypt' - ошибка компоновщика.

Попробуйте связать с -lcrypt: gcc crypt.c -lcrypt.

2 голосов
/ 13 мая 2011

Вы должны добавить -lcrypt при компиляции ... Представьте, что исходный файл называется crypttest.c, вы сделаете:

cc -lcrypt -o crypttest crypttest.c
0 голосов
/ 13 мая 2011

Это может быть вызвано двумя причинами:

  1. Связывание с библиотекой крипты: используйте -l<nameOfCryptLib> в качестве флага для gcc.
    Пример: gcc ... -lcrypt где crypt.hбыл скомпилирован в библиотеку.
  2. Файл crypt.h отсутствует в include path.Вы можете использовать теги < и > вокруг заголовочного файла, только когда файл находится в include path.Чтобы убедиться, что в пути включения присутствует crypt.h, используйте флаг -I, например: gcc ... -I<path to directory containing crypt.h> ...
    Пример: gcc -I./crypt, где crypt.h присутствует в crypt/ sub-directory текущего каталога.

Если вы не хотите использовать флаг -I, измените #include<crypt.h> на #include "crypt.h"

0 голосов
/ 13 мая 2011

Скорее всего, вы забыли связать библиотеку

  gcc ..... -lcrypt
...