C ';未定义对函数的引用';当试图构建一个具有重新定义函数名的头的程序时
我的问题和问这个问题的人完全一样: 我决定按照Alexander给出的说明(第三个答案)进行操作,但在将生成的头文件包含到C语言的主程序中后,我得到了对函数的错误未定义引用 头C ';未定义对函数的引用';当试图构建一个具有重新定义函数名的头的程序时,c,function,elf,C,Function,Elf,我的问题和问这个问题的人完全一样: 我决定按照Alexander给出的说明(第三个答案)进行操作,但在将生成的头文件包含到C语言的主程序中后,我得到了对函数的错误未定义引用 头 #定义SecretFunc1 abab 应用程序.c #包括 #包括“head.h” int main(){ 分泌功能1(); 返回0; } libdyn.c #包括 int SecretFunc1(){ 返回2 } 我已将动态库构建到。so文件中,然后尝试使用以下内容构建应用程序: gcc app.c-L-ldy
#定义SecretFunc1 abab
应用程序.c
#包括
#包括“head.h”
int main(){
分泌功能1();
返回0;
}
libdyn.c
#包括
int SecretFunc1(){
返回2
}
我已将动态库构建到。so
文件中,然后尝试使用以下内容构建应用程序:
gcc app.c-L-ldyn-o示例
函数中未定义对abab的引用
我真的不知道该怎么办。在(部分)预处理之后,您的应用程序.c
将如下所示:
#include <stdio.h>
int main(){
abab();
return 0;
}
编译到对象文件时,此对象文件将引用符号abab
将libdyn.c
编译到目标文件后,它将提供一个名为SecretFunc1
的符号。因此,链接器不会将其与application.o
中的引用abab
匹配
您需要在使用该函数的所有文件中重命名该函数,例如,将
head.h
包含在libdyn.c
中,或者更好地将重命名宏和声明都放在libdyn.h
中,如果您想“混淆”的话,该宏和声明都包含在libdyn.c
和application.c
中符号名称如该答案所示,您还需要在libdyn.c
中包含heah.h
,否则application.c
需要名为abab
的函数,而libdyn.c
将其作为SecretFunc1
提供。但我不明白这有什么意义。你能澄清一下吗?编译器还应该警告您,abab
是在application.c
中隐式声明的。你应该提供一个明确的声明。这是为了我的锻炼。我需要更改一个特定的库符号名称,以便在阅读elf表后,您无法知道它们的作用。不清楚您的练习要求您具体实现什么。特别是,不清楚您得到了什么以及您应该提交什么作为解决方案。在实施中也包括“head.h”
。。。。如果您不这样做,您实际上是在实现SecretFunction
,而不是abab
实现具有加扰名称的共享对象是一个项目崩溃的赌注。成功了,非常感谢您的帮助。现在我明白是怎么回事了。
int SecretFunc1(void);