Linux下能编译成功,而Windows下编译不过?
点击上方「嵌入式大杂烩」,选择「置顶公众号」第一时间查看嵌入式笔记!
前言
前两天有群友在群里问了如下问题:
大概就是用C语言写了一个socket程序,在Linux下使用gcc编译没问题,而在Windows下使用gcc(装了MinGW,编译环境已经装好)编译会提示没有找到socket相关的头文件。
为什么会出现这样的问题?本篇笔记我们来简单分析一下。
头文件从哪来?
在进行分析之前,我们需要思考一个问题:我们的C编程相关的头文件从哪来?
Windows系统:
对于Windows系统,其本身是不带有C语言的一些库及其头文件。我们要进行C语言编程,必须要安装一些开发包(IDE或者MinGW、Cygwin等)。
而我们C编程需要的头文件就在这些开发包中。比如:
MinGW中:
Dev-C++中:
keil中:
我们单片机开发中,有时候也会用到一些标准库,比如keil中:
关于MinGW、Cygwin的内容可看历史文章:
Linux系统:
对于Linux系统,C语言的库及其头文件都是属于系统中的一部分,只要安装了编译工具就可以就行C程序的开发。其相关的头文件在/usr/include
中:
Windows、Linux下C编程?
首先,我们准备一个demo.c
代码:
#include <stdio.h>
int main(void)
{
printf("hello world\n");
return 0;
}
在Windows下使用gcc进行编译(编译命令:gcc -v demo.c
),加-v
参数可以看到编译过程的头文件搜索的一些路径信息及其它信息:
这几个路径就是我们编译demo.c
时需要搜索头文件的路径,即从这几个路径中查找stdio.h
头文件,该头文件所在的路径为:
这个路径是一个很重要的路径,我们C编程使用的一些标准库
头文件都放在这个目录下。C语言的标准库包含哪些头文件?可以到这个网站查看:
https://en.cppreference.com/w/c/header
可以看到,这个C:\MinGW\include
路径中不仅包含有着一些标准库头文件,还包含很多其它的头文件。这些头文件就是与Windows 系统相关的一些头文件,比如:
类似这些头文件是为了开发专门的Windows 程序专用的,比如Windows API编程
:
编译运行:
这个程序用到了windows.h
头文件,这是我们Windows下C编程特有的头文件,与Windows系统密切相关。这样的代码在Linux下使用gcc编译是编译不通过的。
这里需要特别提醒的是
:上面列举的Windows API编程程序是为了说明才举例出来的,Windows API编程虽说也可以编写一些界面程序,但基本上已经被淘汰了,所以不用花时间去学。
下面看一下Linux下gcc编译的一些情况:
/usr/include
路径:
可以看到这里放着一些标准库
头文件及其它头文件。而socket编程相关的头文件在/usr/include/sys
中:
从上面的举例说明中可以很清楚的知道,对于socket编程,Windows、Linux下socket编程也有点不太一样,具体如下:
所以,那位群友把Linux下写的socket程序拷贝到Windows下编译则自然编译出错,即找不到相应头文件。
综上,我们可以在Windows下基于C语言开发一些与Windows密切相关的程序;我们也可以在Linux下基于C语言开发一些与Linux密切相关的程序。
以上就是本次的分享,如有错误,欢迎指出!谢谢
为了便于公众号读者交流学习,小编创建了相关相关交流群。目前,资嵌入式大杂烩交流①群已经满员了。
嵌入式大杂烩交流②群刚创建,坑位有限,感兴趣的朋友可以扫码下方二维码进群,二维码7月9日前有效:
欢迎大家进群交流、共同进步。同时,我也会关注一些大家问的一些问题,从中挑选一些具有代表性的、并且在我知识范围内的问题写出相关文章做分享。
猜你喜欢
最后
若觉得文章不错,转发分享、在看,也是我们继续更新的动力。
在公众号内回复更多资源,可免费获取嵌入式资料。期待你的关注~