怎样学习在linux *** 作系统下用C语言编程

怎样学习在linux *** 作系统下用C语言编程,第1张

这篇文章介绍在LINUX下进行C语言编程所需要的基础知识在这篇文章当中,我们将会学到以下内容:

程序编译

Makefile的编写

程序库的链接

程序的调试

头文件和系统求助

--------------------------------------------------------------------------------

1源程序的编译

在Linux下面,如果要编译一个C语言源程序,我们要使用GNU的gcc编译器 下面我们以一个实例来说明如何使用gcc编译器

假设我们有下面一个非常简单的源程序(helloc):

int main(int argc,char argv)

{

printf("Hello Linux\n");

}

要编译这个程序,我们只要在命令行下执行:

gcc -o hello helloc

gcc 编译器就会为我们生成一个hello的可执行文件执行/hello就可以看到程序的输出结果了命令行中

gcc表示我们是用gcc来编译我们的源程序,-o 选项表示我们要求编译器给我们输出的可执行文件名为hello

而helloc是我们的源程序文件 gcc编译器有许多选项,一般来说我们只要知道其中的几个就够了 -o选项我们已经知道了,表示我们要求输出的可执行文件名

-c选项表示我们只要求编译器输出目标代码,而不必要输出可执行文件 -g选项表示我们要求编译器在编译的时候提供我们以后对程序进行调试的信息 知道了这三个选项,我们就可以编译我们自己所写的简单的源程序了,如果你想要知道更多的选项,可以查看gcc的帮助文档,那里有着许多对其它选项的详细说明

2Makefile的编写

假设我们有下面这样的一个程序,源代码如下:

/ mainc /

#include "mytool1h"

#include "mytool2h"

int main(int argc,char argv)

{

mytool1_print("hello");

mytool2_print("hello");

}

/ mytool1h /

#ifndef _MYTOOL_1_H

#define _MYTOOL_1_H

void mytool1_print(char print_str);

#endif

/ mytool1c /

#include "mytool1h"

void mytool1_print(char print_str)

{

printf("This is mytool1 print %s\n",print_str);

}

/ mytool2h /

#ifndef _MYTOOL_2_H

#define _MYTOOL_2_H

void mytool2_print(char print_str);

#endif

/ mytool2c /

#include "mytool2h"

void mytool2_print(char print_str)

{

printf("This is mytool2 print %s\n",print_str);

}

当然由于这个程序是很短的我们可以这样来编译

gcc -c mainc

gcc -c mytool1c

gcc -c mytool2c

gcc -o main maino mytool1o mytool2o

这样的话我们也可以产生main程序,而且也不时很麻烦但是如果我们考虑一下如果有一天我们修改了其中的一个文件(比如说mytool1c)

那么我们难道还要重新输入上面的命令也许你会说,这个很容易解决啊,我写一个SHELL脚本,让她帮我去完成不就可以了是的对于这个程序来说,是可以

起到作用的但是当我们把事情想的更复杂一点,如果我们的程序有几百个源程序的时候,难道也要编译器重新一个一个的去编译 为此,聪明的程序员们想出了一个很好的工具来做这件事情,这就是make我们只要执行以下make,就可以把上面的问题解决掉在我们执行

make之前,我们要先编写一个非常重要的文件--Makefile对于上面的那个程序来说,可能的一个Makefile的文件是: # 这是上面那个程序的Makefile文件

main:maino mytool1o mytool2o

gcc -o main maino mytool1o mytool2o

maino:mainc mytool1h mytool2h

gcc -c mainc

mytool1o:mytool1c mytool1h

gcc -c mytool1c

mytool2o:mytool2c mytool2h

gcc -c mytool2c

有了这个Makefile文件,不过我们什么时候修改了源程序当中的什么文件,我们只要执行make命令,我们的编译器都只会去编译和我们修改的文件有关的文件,其它的文件她连理都不想去理的

下面我们学习Makefile是如何编写的

在Makefile中也#开始的行都是注释行Makefile中最重要的是描述文件的依赖关系的说明一般的格式是:

target: components

TAB rule

第一行表示的是依赖关系第二行是规则

比如说我们上面的那个Makefile文件的第二行

main:maino mytool1o mytool2o

表示我们的目标(target)main的依赖对象(components)是maino mytool1o mytool2o

当倚赖的对象在目标修改后修改的话,就要去执行规则一行所指定的命令就象我们的上面那个Makefile第三行所说的一样要执行 gcc -o

main maino mytool1o mytool2o 注意规则一行中的TAB表示那里是一个TAB键 Makefile有三个非常有用的变量分别是$@,$^,$

int main(int argc,char argv)

{

double value;

printf("Value:%f\n",value);

}

这个程序相当简单,但是当我们用 gcc -o temp tempc 编译时会出现下面所示的错误

/tmp/cc33Kyduo: In function `main':

/tmp/cc33Kyduo(text+0xe): undefined reference to `log'

collect2: ld returned 1 exit status

出现这个错误是因为编译器找不到log的具体实现虽然我们包括了正确的头文件,但是我们在编译的时候还是要连接确定的库在Linux下,为了

使用数学函数,我们必须和数学库连接,为此我们要加入 -lm 选项 gcc -o temp tempc

-lm这样才能够正确的编译也许有人要问,前面我们用printf函数的时候怎么没有连接库呢是这样的,对于一些常用的函数的实现,gcc编译器会自

动去连接一些常用库,这样我们就没有必要自己去指定了 有时候我们在编译程序的时候还要指定库的路径,这个时候我们要用到编译器的

-L选项指定路径比如说我们有一个库在 /home/hoyt/mylib下,这样我们编译的时候还要加上

-L/home/hoyt/mylib对于一些标准库来说,我们没有必要指出路径只要它们在起缺省库的路径下就可以了系统的缺省库的路径/lib

/usr/lib /usr/local/lib 在这三个路径下面的库,我们可以不指定路径 还有一个问题,有时候我们使用了某个函数,但是我们不知道库的名字,这个时候怎么办呢很抱歉,对于这个问题我也不知道答案,我只有一个傻办

法首先,我到标准库路径下面去找看看有没有和我用的函数相关的库,我就这样找到了线程(thread)函数的库文件(libpthreada)

当然,如果找不到,只有一个笨方法比如我要找sin这个函数所在的库 就只好用 nm -o /lib/so|grep

sin>~/sin 命令,然后看~/sin文件,到那里面去找了

在sin文件当中,我会找到这样的一行libm-212so:00009fa0 W sin 这样我就知道了sin在

libm-212so库里面,我用 -lm选项就可以了(去掉前面的lib和后面的版本标志,就剩下m了所以是 -lm)

如果你知道怎么找,请赶快告诉我,我回非常感激的谢谢! 4程序的调试

我们编写的程序不太可能一次性就会成功的,在我们的程序当中,会出现许许多多我们想不到的错误,这个时候我们就要对我们的程序进行调试了

最常用的调试软件是gdb如果你想在图形界面下调试程序,那么你现在可以选择xxgdb记得要在编译的时候加入

-g选项关于gdb的使用可以看gdb的帮助文件由于我没有用过这个软件,所以我也不能够说出如何使用

不过我不喜欢用gdb跟踪一个程序是很烦的事情,我一般用在程序当中输出中间变量的值来调试程序的当然你可以选择自己的办法,没有必要去学别人的现

在有了许多IDE环境,里面已经自己带了调试器了你可以选择几个试一试找出自己喜欢的一个用

5头文件和系统求助

有时候我们只知道一个函数的大概形式,不记得确切的表达式,或者是不记得着函数在那个头文件进行了说明这个时候我们可以求助系统

比如说我们想知道fread这个函数的确切形式,我们只要执行 man fread

系统就会输出着函数的详细解释的和这个函数所在的头文件说明了 如果我们要write这个函数的说明,当我们执行man

write时,输出的结果却不是我们所需要的

因为我们要的是write这个函数的说明,可是出来的却是write这个命令的说明为了得到write的函数说明我们要用 man 2 write

2表示我们用的write这个函数是系统调用函数,还有一个我们常用的是3表示函数是C的库函数 记住不管什么时候,man都是我们的最好助手

--------------------------------------------------------------------------------

好了,这一章就讲这么多了,有了这些知识我们就可以进入激动人心的Linux下的C程序探险活动

不积跬步,无以至千里!

[oracle@localhost test]$ cat csh

#!/bin/sh

b=0

echo "请出入n的值:"

read n

for ((a=1;a<=n;a++))

do

b=1/$a+$b

done

c=`bc<<!

scale=5

$b

!

`

echo "运算式是:$b"

echo "最后的结果是:$c"

[oracle@localhost test]$ sh csh

请出入n的值:

20

运算式是:1/20+1/19+1/18+1/17+1/16+1/15+1/14+1/13+1/12+1/11+1/10+1/9+1/8+1/7+1/6+1/5+1/4+1/3+1/2+1/1+0

最后的结果是:359768

[oracle@localhost test]$

一:C语言嵌入式Linux工程师的学习需要具备一定的C语言基础,C语言是嵌入式领域最重要也是最主要的编程语言,通过大量编程实例重点理解C语言的基础编程以及高级编程知识。包括:基本数据类型、数组、指针、结构体、链表、文件 *** 作、队列、栈等。

二:Linux基础Linux *** 作系统的概念、安装方法,详细了解Linux下的目录结构、基本命令、编辑器VI,编译器GCC,调试器GDB和Make项目管理工具,ShellMakefile脚本编写等知识,嵌入式开发环境的搭建。

三:Linux系统编程重点学习标准I/O库,Linux多任务编程中的多进程和多线程,以及进程间通信(pipe、FIFO、消息队列、共享内存、signal、信号量等),同步与互斥对共享资源访问控制等重要知识,主要提升对Linux应用开发的理解和代码调试的能力。

四:Linux网络编程计算机网络在嵌入式Linux系统应用开发过程中使用非常广泛,通过Linux网络发展、TCP/IP协议、socket编程、TCP网络编程、UDP网络编程、Web编程开发等方面入手,全面了解Linux网络应用程序开发。重点学习网络编程相关API,熟练掌握TCP协议服务器的编程方法和并发服务器的实现,了解>

五:数据结构与算法数据结构及算法在嵌入式底层驱动、通信协议、及各种引擎开发中会得到大量应用,对其掌握的好坏直接影响程序的效率、简洁及健壮性。此阶段的学习要重点理解数据结构与算法的基础内容,包括顺序表、链表、队列、栈、树、图、哈希表、各种查找排序算法等应用及其C语言实现过程。

六:C、QTC是Linux应用开发主要语言之一,本阶段重点掌握面向对象编程的基本思想以及C的重要内容。图形界面编程是嵌入式开发中非常重要的一个环节。由于QT具有跨平台、面向对象、丰富API、支持2D/3D渲染、支持XML、多国语等强大功能,在嵌入式领域的GUI开发中得到了广范的应用,在本阶段通过基于QT图形库的学习使学员可以熟练编写GUI程序,并移植QT应用程序到Cortex-A8平台。包括IDE使用、QT部件及布局管理器、信息与槽机制的应用、鼠标、键盘及绘图事件处理及文件处理的应用。

七:CortexA8、Linux平台开发通过基于ARMCortex-A8处理s5pv210了解芯片手册的基本阅读技巧,掌握s5pv210系统资源、时钟控制器、电源管理、异常中断控制器、nandflash控制器等模块,为底层平台搭建做好准备。Linux平台包括内核裁减、内核移植、交叉编译、GNU工具使用、内核调试、Bootloader介绍、制作与原理分析、根文件系统制作以及向内核中添加自己的模块,并在s5pv210实验平台上运行自己制作的Linux系统,集成部署Linux系统整个流程。同时了解Android *** 作系统开发流程。Android系统是基于Linux平台的开源 *** 作系统,该平台由 *** 作系统、中间件、用户界面和应用软件组成,是首个为移动终端打造的真正开放和完整的移动软件,目前它的应用不再局限于移动终端,还包括数据电视、机顶盒、PDA等消费类电子产品。

八:驱动开发驱动程序设计是嵌入式Linux开发工作中重要的一部分,也是比较困难的一部分。本阶段的学习要熟悉Linux的内核机制、驱动程序与用户级应用程序的接口,掌握系统对设备的并发 *** 作。熟悉所开发硬件的工作原理,具备ARM硬件接口的基础知识,熟悉ARMCortex-A8处理器s5pv210各资源、掌握Linux设备驱动原理框架,熟悉工程中常见Linux高级字符设备、块设备、网络设备、USB设备等驱动开发,在工作中能独立胜任底层驱动开发。

以上就是列出的关于一名合格嵌入式Linux开发工程师所必学的理论知识,其实,作为一个嵌入式开发人员,专业知识和项目经验同样重要,所以在我们的理论学习中也要有一定的项目实践,锻炼自己的项目开发能力。

我提供的代码如下,自己补充main函数哈,希望能够帮到你:)

//相关头文件:

#include <stdioh>

#include <signalh>

#include <stdlibh>

#include <unistdh>

#include <sys/typesh>

#include <sys/stath>

#include <fcntlh>

发送方send:

void fifo_pro()

{

char s[128];

int fd;

FILE fp;

fp = fopen("/atxt", "r");

mkfifo("/tmp/fifotst", 0644);

fd = open("/tmp/fifotst", O_WRONLY);

while(fgets(s, 127, fp) != NULL) {

write(fd, s, strlen(s));

//printf("%s",s);

}

close(fd);

fclose(fp);

unlink("/tmp/fifotst");

}

接收方get:

char s[128];

int fd = open("/tmp/fifotst", O_RDONLY);

int fd2 = open("/btxt", O_WRONLY)

memset(s, 0, 128);

while(read(fd, s, 128) > 0) {

printf("%s", s);

write(fd2, s, 128);

}

close(fd2);

close(fd);

不依赖桌面环境,但是依赖运行库。你可以有Gnome的运行库同时使用KDE桌面系统。也就是说只要用户安装了依赖的文件,那么两种GUI设计出的程序都是可以运行的,只不过显示上可能有所差别,同一个程序,在GNOME下运行的显示效果可能会和在KDE下的不同。

我个人是学习的GTK,但是说实话QT目前确实在跨平台上有优势,而且我也感觉两者各有长处,因此不好说推荐你学什么。

至于你说的在Deepin Linux下编译不通过,但是在Slax上通过的程序,正如前面提到的,是库的问题,也许是你在Deepin Linux没有安装对应的开发包或者版本不符而Slax上正确安装的原因

以上就是关于怎样学习在linux *** 作系统下用C语言编程全部的内容,包括:怎样学习在linux *** 作系统下用C语言编程、linux shell程序设计,输入n,计算1+1/2+1/3+...+1/n。要求调用bc、Linux环境下C开发_linux搭建c语言开发环境等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9833945.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-02
下一篇2023-05-02

发表评论

登录后才能评论

评论列表(0条)

    保存