make无法编译,未定义对`EVP_DigestUpdate的引用

时间:2013-11-10 01:21:04

标签: c gcc makefile static-linking dynamic-linking

我正在尝试在我的ubuntu 13:04上安装一个开源项目,但make进程在名为 updateDB.c 的类中的方法上失败。在编译期间,我有这个错误:

updateDB.o: In function `update_cache_hash':
/usr/local/src/bgpinspect-0.5/src/updateDB.c:142: undefined reference to `EVP_DigestUpdate'
/usr/local/src/bgpinspect-0.5/src/updateDB.c:143: undefined reference to `EVP_DigestFinal_ex'
collect2: error: ld returned 1 exit status
make[1]: *** [BGPdb] Error 1
make[1]: Leaving directory `/usr/local/src/bgpinspect-0.5/src'
make: *** [all] Error 2

这是失败的方法 update_cache_hash

static uint16_t update_cache_hash( char *buff, int size ) {
    unsigned char md_hash[EVP_MAX_MD_SIZE];
    unsigned int md_len;
    uint16_t hash;

    EVP_DigestUpdate(&global_table.ctx, buff, size );
    EVP_DigestFinal_ex(&global_table.ctx, md_hash, &md_len);

    if ( md_len < 2 ) {
        ps_log( PS_LOG_ERROR, "EVP_DigestFinal_ex returned a short hash.\n" );
        return 0;
    }

    hash = ( (uint16_t) md_hash[md_len - 2] << 8 ) | md_hash[md_len - 1];
    hash = UPDATE_CACHE_MASK( hash );

    return hash;
}

此类的顶部有一个include语句

#include <openssl/evp.h>

我在libssl-dev旁边的计算机上安装了openssl;我无法弄清楚为什么它会给出错误,因为我是c和静态链接等新手。 我在这条道路上有 evp.h /usr/include/openssl/evp.h

那么我如何更改makefile或配置为修复此问题?因为看来make看不到这条路径 /usr/include/openssl/evp.h

2 个答案:

答案 0 :(得分:4)

undefined reference错误是链接器错误,因此看起来gcc找到/usr/include/openssl/evp.h但链接器无法找到具有EVP_DigestUpdate和{的库{1}}函数。

我会检查相关的makefile是否有EVP_DigestFinal_ex个参数,并且-lcrypto在您的系统上找到了正确的make

答案 1 :(得分:0)

链接器找不到libssl函数。您需要将libssl链接到您的项目。

此SO文章中有一些建议:Undefined reference to t1sl_steup_key_block when linking OpenSSL

例如,在你的makefile中,你要添加-lssl:

gcc somefile.c -o someprogram -lssl