今天在学习初级linux c的时候遇到了如下问题:通过主函数调用同路径下的子文件函数调用失败。博主是这样一一解决的:
首先:hello.c:
1 hello.c: 2 #include<bool.c> 3 int main() 4 { 5 boo(); 6 return 0; 7 } 8 9 bool.c: 10 #include<bool.h> 11 void boo() 12 { 13 printf("hello.c\n"); 14 } 15 16 bool.h 17 #include<stdio.h> 18 void boo();
这里gcc hello.c 会提示这样的错误:no such file or directory。之后博主查阅相关资料发现,在include语句中,"<>" 表示在标准路径中搜索头文件,在Linux中默认为"/usr/include"。故将#include<bool.c>改为 #include"bool.c"就可以了,那个#include<bool.h>也需要改。如果不这样改动,需要用这样的命令编译 gcc hello.c -I(大写i)<当前路径>来编译才会正常。这里的 I 是用来向编译器指明非默认地址下的头文件路径。
还有一个问题:如果在主函数文件中直接包含bool.h头文件,会找不到boo()函数。这个问题还没有解决。
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
问题已解决:2018.6.28
直接包含bool.h头文件,bool.c并为参加编译,故,声明了void boo() 但是找不到boo函数原码。编译代码分为:1.预处理,2.编译,3.汇编,4.链接
1.采用#include<bool.c> 这个实在预处理的时候将bool.c中得所有代码都加进hello.c中的,故其可编译执行
2.如果没有#include<bool.c>,只是#include<bool.h>,这是用gcc hello.c -o hello 去编译文件,并未将bool.c编译进去,此时编译可执行1,2,3,步,但是执行到第4步的时候,链接不到应执行的函数(就是bool没有编进机器码,找不到其地址,相当于不存在此函数的二进制执行码),故会提示找不到boo()函数。不过gcc hello.c bool.c -o hello这样讲bool.c编译进去就可以了
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
2018.7.8
今天,在c调用子文件,又有了点收获。
在include中的文件在,预处理时会加入进本文件,文件里的一些声明也会被加进来,注意只是声明。函数本体还在其他.c文件,不会被加载进来,这时的声明相当于一个标签(或者标号),在第四步,链接时会通过这个标签去找相应的函数(前提是,包含这个函数的文件和主文件一起参加编译)。另外子文件也会进行那四步。