void kzfree(const void *p) {
size_t ks;
void *mem = (void *)p;
if (unlikely(ZONP(mem)))
return;
ks = ksize(mem);
memset(mem, 0, ks);
kfree(mem);
}
因为我正在研究的内核还没有kzfree。 现在,当我尝试编译DigSig时,这是输出:
/home/Chris/dsTest/dsi_sysfs.o: In function `kzfree':
/usr/src/kernels/2.6.18-194.32.1.el5-i686/include/linux/crypto.h:114: multiple definition of `kzfree'
/home/Chris/dsTest/digsig.o:/usr/src/kernels/2.6.18-194.32.1.el5-i686/include/linux/crypto.h:114: first defined here
/home/Chris/dsTest/digsig_cache.o: In function `kzfree':
/usr/src/kernels/2.6.18-194.32.1.el5-i686/include/linux/crypto.h:114: multiple definition of `kzfree'
/home/Chris/dsTest/digsig.o:/usr/src/kernels/2.6.18-194.32.1.el5-i686/include/linux/crypto.h:114: first defined here
/home/Chris/dsTest/digsig_revocation.o: In function `kzfree':
/usr/src/kernels/2.6.18-194.32.1.el5-i686/include/linux/crypto.h:114: multiple definition of `kzfree'
/home/Chris/dsTest/digsig.o:/usr/src/kernels/2.6.18-194.32.1.el5-i686/include/linux/crypto.h:114: first defined here
/home/Chris/dsTest/dsi_sig_verify.o: In function `kzfree':
/usr/src/kernels/2.6.18-194.32.1.el5-i686/include/linux/crypto.h:114: multiple definition of `kzfree'
/home/Chris/dsTest/digsig.o:/usr/src/kernels/2.6.18-194.32.1.el5-i686/include/linux/crypto.h:114: first defined here
当然,所有内容都被#ifndef-Guards所覆盖,所以我无法理解为什么他多次定义这个函数... 有什么想法吗?
答案 0 :(得分:1)
您的包含文件包含在多个位置。 这不是编译时错误。而是一个链接的时间错误。 您的每个文件都是在.o文件
之后编译和生成的/home/Chris/dsTest/dsi_sysfs.o
/home/Chris/dsTest/digsig_cache.o
/home/Chris/dsTest/digsig_revocation.o
/home/Chris/dsTest/dsi_sig_verify.o
现在将它们链接在一起时,它会找到kzfreez的多个定义,在上面的.o文件中各有一个,因为它们包含相应的c文件
/usr/src/kernels/2.6.18-194.32.1.el5-i686/include/linux/crypto.h
你有ifdef保护文件,但这只会阻止.h文件包含在同一个c文件(翻译单元)中,而不是在不同的c文件中。
您应该在c文件中编写该函数并添加make文件,以便单独编译并链接。并且只在crypto.h
中添加声明。 (对于测试,您可以在crypto.c
中添加定义并在crypto.h
中添加声明。)