3

私はcrypt()関数を使用しており、問題という名前のコンパイル フラグ-lcryptは、コンパイラが への未定義の参照を示していることcrypt()です。誰が私が間違っているのか教えてもらえますか?

Makefile

    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

main.c

#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 manualとの違い(コメントで要求されているとおり)の理由の説明:

-図書館

[...]

コマンドのどこにこのオプションを記述するかによって違いが生じます。リンカーは、指定された順序でライブラリとオブジェクト ファイルを検索して処理します。

したがって、「foo.o -lz bar.o」は、ファイル「foo.o」の後、「bar.o」の前にライブラリ「z」を検索します。「bar.o」が「z」内の関数を参照する場合、それらの関数はロードされない可能性があります。

于 2012-10-14T16:35:12.497 に答える