前言
前两天有群里在群里问了如下问题:
![b76cc66635cd104f8ff7d463456cdd07.png](https://i-blog.csdnimg.cn/blog_migrate/266cac0b44902ffd5c49df48e3cc19fc.jpeg)
大概就是用C语言写了一个socket程序,在Linux下使用gcc编译没问题,而在Windows下使用gcc(装了MinGW,编译环境已经装好)编译会提示没有找到socket相关的头文件。为什么会出现这样的问题?本篇笔记我们来简单分析一下。
头文件从哪来?
在进行分析之前,我们需要思考一个问题:我的C编程相关的头文件从哪来?
1、Windows系统:
对于Windows系统,其本身是不带有C语言的一些库及其头文件。我们要进行C语言编程,必须要安装一些开发包(IDE或者MinGW、Cygwin等)。而我们C编程需要的头文件就在这些开发包中。比如:
(1)MinGW中:
![53953f955459f6fa6501823f86d2cf80.png](https://i-blog.csdnimg.cn/blog_migrate/cf77c4fce6e8bafaa40994cc0049db85.jpeg)
(2)Dev-C++中:
![15adf88fed81347b7918a0272c642ea3.png](https://i-blog.csdnimg.cn/blog_migrate/7fbe474ede56dc65c2e069e0402c8f03.jpeg)
(3)keil中:
我们单片机开发中,有时候也会用到一些标准库,比如keil中:
![c4ad5770c242b9caa05529bfe0cd1416.png](https://i-blog.csdnimg.cn/blog_migrate/d6526d1ba2c73fa1e8e838b4e11edc41.jpeg)
2、Linux系统:
对于Linux系统,C语言的库及其头文件都是属于系统中的一部分,只要安装了编译工具就可以就行C程序的开发。其相关的头文件在/usr/include中:
![644d6bb66f4cda8db1b1a476747ff53a.png](https://i-blog.csdnimg.cn/blog_migrate/5991eac98c06deea0d06e41dca048e18.jpeg)
Windows、Linux下C编程区别?
首先,我们准备一个demo.c代码:
#include int main(void){ printf("hello world"); return 0;}
在Windows下使用gcc进行编译(编译命令:gcc -v demo.c),加-v参数可以看到编译过程的头文件搜索的一些路径信息及其它信息:
![bb0f6ffd6eda205d706fb8389f77ca2d.png](https://i-blog.csdnimg.cn/blog_migrate/9479d661c60ae780176fd0787e4b5bba.jpeg)
这几个路径就是我们编译demo.c时需要搜索头文件的路径,即从这几个路径中查找stdio.h头文件,该头文件所在的路径为:
![ac9d23e005c84a259d7f520e571422f2.png](https://i-blog.csdnimg.cn/blog_migrate/06aa8743cd60cf46e310bcf1ed4bcd56.jpeg)
这个路径是一个很重要的路径,我们C编程使用的一些标准库头文件都放在这个目录下。C语言的标准库包含哪些头文件?可以到这个网站查看:
https://en.cppreference.com/w/c/header
![af486d672c3c3bd080b8979937b85f29.png](https://i-blog.csdnimg.cn/blog_migrate/b9f41d73d241a639dce9acc9f1f3df6f.jpeg)
可以看到,这个C:MinGWinclude路径中不仅包含有着一些标准库头文件,还包含很多其它的头文件。这些头文件就是与Windows 系统相关的一些头文件,比如:
![41faa73ca6351f9ea8fd62428806f59d.png](https://i-blog.csdnimg.cn/blog_migrate/d2f2706c7750ebdc15b1c88299736dad.jpeg)
类似这些头文件是为了开发专门的Windows 程序专用的,比如Windows API编程:
![301b9573724ca3c9cae19d32b1c7393b.png](https://i-blog.csdnimg.cn/blog_migrate/d52d8e7b906b159ad508d39efb56b07c.jpeg)
编译运行:
![bfe82a7097ac8d4913a0022ef1e87876.png](https://i-blog.csdnimg.cn/blog_migrate/763488299b4c8c85f3137ba0e6cbf82c.jpeg)
这个程序用到了windows.h头文件,这是我们Windows下C编程特有的头文件,与Windows系统密切相关。这样的代码在Linux下使用gcc编译是编译不通过的。
这里需要特别提醒的是:上面列举的Windows API编程程序是为了说明才举例出来的,Windows API编程虽说也可以编写一些界面程序,但基本上已经被淘汰了,所以不用花时间去学。
下面看一下Linux下gcc编译的一些情况:
![1026b1425b44114079b9630c6dda44e9.png](https://i-blog.csdnimg.cn/blog_migrate/36d145f57b7cacb06e15fc449d55fba3.jpeg)
/usr/include路径:
![72d4d562ae120f2ee0d2a471aaeac725.png](https://i-blog.csdnimg.cn/blog_migrate/504accf8a33d1e16a65d04843eb5f432.jpeg)
可以看到这里放着一些标准库头文件及其它头文件。而socket编程相关的头文件在/usr/include/sys中:
![b365f2f05fd366ebf7fa12f21d5fe2df.png](https://i-blog.csdnimg.cn/blog_migrate/61cb2617de252ad80b6ffe15c7fdc365.jpeg)
从上面的举例说明中可以很清楚的知道,对于socket编程,Windows、Linux下socket编程也有点不太一样,具体如下:
![36924fa3ae87515c55f1fc7a727da7fd.png](https://i-blog.csdnimg.cn/blog_migrate/c0ff7704f267a78e14b4ad084c74acb8.jpeg)
所以,那位群友把Linux下写的socket程序拷贝到Windows下编译则自然编译出错,即找不到相应头文件。
综上,我们可以在Windows下基于C语言开发一些与Windows密切相关的程序;我们也可以在Linux下基于C语言开发一些与Linux密切相关的程序。
以上就是本次的分享,如有错误,欢迎指出!谢谢