gpt4 book ai didi

c - 为什么C头文件中的函数在main.c中可用,但在编译时出现未定义错误?

转载 作者:行者123 更新时间:2023-11-30 19:11:51 26 4
gpt4 key购买 nike

我在 Ubuntu 15.10 上的 Eclipse (Neon) 中有一个 C 项目。我已经下载了 OpenSSL 库。

我已将 openssl/bn.h 包含在我的预处理器指令中。在我的 main.c 文件中,我可以引用 BN_new(),这是 bn.h 中的函数:

bn.h

但是,当我尝试编译时,我得到了对 bn.h 的所有调用的 undefined reference (BN_new(), BN_free()等)。

BN_new undefined

顺便说一句,我将 openssl-1.0.2h/include/openssl 的内容复制到我的 /usr/include/ 目录中。

为什么编译时会出现这个错误?

我的代码:

#include <stdio.h>
#include "jpake.h"
#include <openssl/crypto.h>
#include <openssl/sha.h>
#include <openssl/err.h>
#include <openssl/bn.h>
#include <memory.h>

/*
* In the definition, (xa, xb, xc, xd) are Alice's (x1, x2, x3, x4) or
* Bob's (x3, x4, x1, x2). If you see what I mean.
*/
typedef struct
{
char *name; /* Must be unique */
char *peer_name;
BIGNUM *p;
BIGNUM *g;
BIGNUM *q;
BIGNUM *gxc; /* Alice's g^{x3} or Bob's g^{x1} */
BIGNUM *gxd; /* Alice's g^{x4} or Bob's g^{x2} */
} JPAKE_CTX_PUBLIC;


struct JPAKE_CTX
{
JPAKE_CTX_PUBLIC p;
BIGNUM *secret; /* The shared secret */
BN_CTX *ctx;
BIGNUM *xa; /* Alice's x1 or Bob's x3 */
BIGNUM *xb; /* Alice's x2 or Bob's x4 */
BIGNUM *key; /* The calculated (shared) key */
};

static void JPAKE_ZKP_init(JPAKE_ZKP *zkp)
{
zkp->gr = BN_new();
zkp->b = BN_new();
}

static void JPAKE_ZKP_release(JPAKE_ZKP *zkp)
{
BN_free(zkp->b);
BN_free(zkp->gr);
}

typedef struct
{
const char *name; //must be unique
int base; //1 for Alice, 3 for Bob. Only used for printing stuff


}JPakeUserPublic;


typedef struct
{
JPakeUserPublic p;
BIGNUM *secret; //the shared secret
BIGNUM *key; //the calculated (shared) key
BIGNUM *xa; //ALice's x1 or Bob's x3
BIGNUM *xb; //ALice's x2 or Bob's x4

}JPakeUser;

int main(int argc, char **argv)
{
JPakeUser alice, bob;
alice.p.name = "Alice";
alice.p.base = 1;
bob.p.name = "Bob";
bob.p.base = 3;

puts(alice.p.name);
}

我不是新开发人员,但我对 C 和 eclipse 很陌生,所以我已经为此奋斗了一段时间。我也一直在尝试这个项目的 makefile。这是我的 makefile(它是根据 C++ 示例修改的):

all: hash4.exe

clean:
rm jpakedemo.o hash4.exe

hash4.exe: jpakedemo.c
gcc -g -o hash4 jpakedemo.c

jpakedemo.o:
gcc -c -g jpakedemo.c

最佳答案

.h头文件的目的是描述特定函数“看起来像什么”,以便可以生成正确的代码来调用该函数功能。

但这本身并没有提供该功能本身!

“将所有不同的编译器输出和库链接成‘一个可以实际运行的完整的东西’”的最终过程是由一个单独的程序执行的总共......这被称为“链接器”。

您引用的子例程可能来自多个位置:来自另一个单独编译的源程序,来自库。 (如果来自库,则该库可能是“静态”或“动态”链接的。)无论如何,必须找到必要的目标代码,以便将它们合并到最终的可执行文件中.

毫无疑问,OpenSSL 子例程来自(它是 OpenSSL 的一部分)。因此,您的 Eclipse 项目目前可能不包含对该库的引用,以便在需要时可以找到它。

关于c - 为什么C头文件中的函数在main.c中可用,但在编译时出现未定义错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38863425/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com