我正在尝试将 bcrypt 实现到我发现的一个开源项目中,这更多的是一种学习的东西。我已经 git 克隆 https://github.com/rg3/bcrypt并将 bcrypt.h bcrypt.c
和 crypto_blowfish
移动到我的项目文件中,然后在我的文件 database.c
中,我已经
include "bcrypt.h"
然后当我运行 make
时,我得到:
database.c:2084: undefined reference to `bcrypt_checkpw'
这就是我的使用方式
int ret;
ret = bcrypt_checkpw(pass, row[0]);
assert(ret != -1);
if (ret == 0) {
return 1;
} else {
return 2;
}
我有一个 Makefile
我不确定我是否做对了,但我将 bcrypt.h
添加到了 makefile
.obj/database.o: database.c bcrypt.h server.h log.h create.h player.h sleep.h tool.h drdata.h drvlib.h timer.h direction.h map.h mem.h database.h misc_ppd.h badip.h
全部编译
gcc -O -g -m32 -rdynamic -L/usr/lib/mysql -o server .obj/server.o .obj/io.o .obj/libload.o .obj/tool.o .obj/sleep.o .obj/log.o .obj/create.o .obj/notify.o .obj/skill.o .obj/do.o .obj/act.o .obj/player.o .obj/rdtsc.o .obj/los.o .obj/light.o .obj/map.o .obj/path.o .obj/error.o .obj/talk.o .obj/drdata.o .obj/death.o .obj/database.o .obj/see.o .obj/drvlib.o .obj/timer.o .obj/expire.o .obj/effect.o .obj/command.o .obj/date.o .obj/container.o .obj/store.o .obj/mem.o .obj/sector.o .obj/chat.o .obj/statistics.o .obj/mail.o .obj/player_driver.o .obj/clan.o .obj/lookup.o .obj/area.o .obj/task.o .obj/punish.o .obj/depot.o .obj/prof.o .obj/motd.o .obj/ignore.o .obj/tell.o .obj/clanlog.o .obj/respawn.o .obj/poison.o .obj/swear.o .obj/lab.o .obj/consistency.o .obj/btrace.o .obj/club.o .obj/teufel_pk.o .obj/questlog.o .obj/badip.o -lmysqlclient -lm -lz -ldl -lpthread
.obj/database.o: In function `load_char_pwd':
/home/ec2-user/astonia3_server/database.c:2084: undefined reference to `bcrypt_checkpw'
collect2: error: ld returned 1 exit status
make: *** [server] Error 1
最佳答案
.h 文件中的 bcrypt_checkpw
放在 extern C
上,因此它具有 C 链接
.c 文件中的 bcrypt_checkpw
具有 C++ 链接
它们是不同的符号,因此您会收到链接错误。
关于c - 我已经包含了一个头文件,但在尝试运行 make 时仍然未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35550576/