dir1有dir2,file1.c和file1.h。
dir2有file2.c
现在,如果我想访问file2.c中file1.c中定义的函数,我需要在file1.h中声明它并在file2.c中包含file1.h - 这是一个有效的假设吗?
如果不是,请解释。
如果是,即使这样做,我得到“未定义的函数引用”错误。
file2.c:29:对`function'的未定义引用 collect2:ld返回1退出状态 * 错误代码1
答案 0 :(得分:3)
编译c程序分两步执行:编译和链接。编译将源代码转换为目标代码,链接将目标代码放在一起,并将所有符号绑定在一起。
您的问题是链接器问题,而不是编译器问题。
您可能正在运行以下内容:
gcc dir_2/file2.c
相反,请执行以下操作:
gcc -c dir_2/file2.c
gcc -c file1.c
gcc -o out file1.o file2.o
原因发生这种情况并不是因为您没有在标头中声明该功能,或者没有正确包含标头。当链接器尝试将所有符号放在可执行文件中时,它找不到您的函数,因为您只链接程序的 half 。
答案 1 :(得分:2)
包含.h文件是不够的,因为它只包含该函数的原型而不是函数的定义,函数的定义是在单独的.c文件中。
修复它的一种方法就是键入:
gcc -o out file1.c file2.c
或者Nate说你可以分开编译过程和链接过程
答案 2 :(得分:-1)
现在,如果要访问在file2.c中的file1.c中定义的函数
在FILE1.c中定义的功能 从FILE2.c访问 示例函数:void sync(all){start sync ...}
需要File2.h
在File2.c上需要AND
没什么!
我总是在File2.h中也使用关键字EXTERN
示例:
投票也有效,选择自己感觉更好的东西,当我看到 编码期间发生了什么。 想象其他团队成员必须检查您的代码,这将变得更加困难...