3

我使用crypt()函数和命名-lcrypt问题的编译标志是编译器说未定义的引用crypt()。谁能告诉我我做错了什么?

生成文件

    CC = gcc
    CFLAGS=-Wall -lm -lcrypt
    OBJS = get_passwords_hashed.o
    PROG = get_passwords_hashed.exe

    #adicionar or mudar o OBJS se tiver outras files para o programa


    #GENERIC

    all:    ${PROG}

    clean:
            rm ${OBJS} *~ ${PROG}

    ${PROG}: ${OBJS}
            ${CC} ${OBJS} -o $@

    .c.o:
            ${CC} $< -c -o $@
    # $@ - turns .c into .o 
    ###################################
    #dependencias
    so_final.o: get_passwords_hashed.c get_passwords_hashed.h

主程序

#include <stdio.h>
#include <string.h>
#include <crypt.h>

int testar_pass(char ant[],char (*pointer_hashes)[max_chars_string]){ // ponteiro para array de chars - char ** ant
     char * password ;
     char * encrypted;
     password = malloc(strlen(ant)*sizeof(char)); //password calculada recebida anteriror
     encrypted = malloc(strlen(ant)*sizeof(char));//hash
     strcpy(password,ant);
     encrypted = crypt(password,"10");
     if(strcmp(*pointer_hashes,encrypted) == 0){
         return 1;
         }
     else return 0;// devolve erro
}
4

1 回答 1

10

-lm -lcrypt在编译行的末尾传递。

LIBS=-lm -lcrypt

${CC} ${OBJS} -o $@ ${LIBS}

编辑:

gcc 从手册中解释为什么它会有所不同(如评论中所要求的):

-图书馆

[...]

在命令中编写此选项的位置有所不同;链接器按照指定的顺序搜索和处理库和目标文件。

因此,“foo.o -lz bar.o”在文件“foo.o”之后但在“bar.o”之前搜索库“z”。如果“bar.o”引用“z”中的函数,则可能不会加载这些函数。

于 2012-10-14T16:35:12.497 回答