搜索

tag 标签: linux

相关帖子

版块 作者 回复/查看 最后发表
一场直播+2个笔记,实践、弄懂MPU的Linux安全引导步骤 attachment Microchip MCU nmg 2020-7-31 0 506 nmg 2020-7-31 12:25
Linux内核启动流程-迅为IMX6ULL开发板(一) ARM技术 马佳徐徐 2020-7-17 0 505 马佳徐徐 2020-7-17 11:07
机械臂末端运动稳定性评估(附linux实时波形客户端源码) attach_img ST MEMS传感器创意设计大赛专区 tinnu 2020-7-6 0 710 tinnu 2020-7-6 01:25
R7-4800h的R7000,编译5.6.18内核linux,是make -j8快还是-j16快? 不提make -j Linux与安卓 oyhprince 2020-6-11 3 855 oyhprince 2020-6-12 17:06
请教一下嵌入式Linux下怎么保存采集回来的数据 Linux与安卓 世事无常 2020-5-7 2 564 世事无常 2020-5-12 15:46
ZYNQ 从nand启动Linux系统、烧写总是失败? attach_img ARM技术 后来小生 2020-3-27 1 781 littleshrimp 2020-3-27 12:29
iTOP-3399开发板之Linux镜像烧写(一) attach_img 嵌入式系统 塔7呃 2020-3-12 1 575 兰博 2020-3-12 16:08
FreeRTOS和Linux相比,有哪些具体的区别 attach_img 嵌入式系统 兰博 2020-3-10 1 1472 bigbat 2020-3-10 12:09
iTOP-3399开发板Linux系统编译烧写-获取/安装/编译Linux源码 attach_img 嵌入式系统 塔7呃 2020-3-5 0 808 塔7呃 2020-3-5 11:48
Linux是什么?为何华为基于Linux开发鸿蒙系统? Linux与安卓 华清远见G 2020-2-28 1 629 bigbat 2020-2-28 11:48
【工程源码】Linux 查看进程和删除进程 Altera SoC 小梅哥 2020-2-23 0 303 小梅哥 2020-2-23 20:06
【工程源码】基于FPGA的Linux下操作FPGA侧寄存器 Altera SoC 小梅哥 2020-2-14 0 303 小梅哥 2020-2-14 18:32
KiCad 设计的开源 Linux 手机 attach_img PCB设计 taotieren 2019-12-17 16 1750 taotieren 2020-4-10 16:18
RISC-V SoC FPGA架构为Linux带来了实时性 attach_img Linux与安卓 朗锐智科 2018-12-7 1 1965 star_66666 2018-12-7 17:47
makefile error:makefile:2: *** missing separator. Stop. attach_img Linux与安卓 wudidajundui 2018-4-20 1 1255 wudidajundui 2018-4-20 16:30
STM32在部分Linux中工作不正常 Linux与安卓 allankliu 2018-1-17 3 2035 allankliu 2018-3-23 08:57
高新诚聘:嵌入式软件工程师,欢迎应届优秀毕业生应聘 工作这点儿事 司龙云 2019-8-16 0 505 司龙云 2019-8-16 21:31
【工程源码】挂载镜像SD卡的FAT32文件系统分区到Linux中 attach_img Altera SoC 小梅哥 2020-2-23 0 303 小梅哥 2020-2-23 19:37
【工程源码】Linux应用程序中使用math库报undefined reference to `sin'等 attach_img Altera SoC 小梅哥 2020-2-23 0 303 小梅哥 2020-2-23 20:11
Altera-SoCFPGA-HelloWorld-Linux-GNU attachment Altera SoC 雷北城 2020-6-9 0 505 雷北城 2020-6-9 16:20

相关日志

分享 嵌入式linux简介
wuquan-1230 2020-2-26 21:47
嵌入式linux简介
嵌入式linux系统应用非常广泛,涵盖各行各业,基于ARM、mips等微处理器架构的硬件平台。基于嵌入式linux系统的设备已经深入生活中各个角落,随处可见。   我们常说的嵌入式linux系统,其实与电脑端运行的linux系统本质上是一样的,都是使用的linux内核,相同的文件系统目录结构。区别在于嵌入式linux系统多少经过裁剪的,可能在操作时你会发现,有些命令不支持,或者有些命令的个别参数不支持!还有就是内核的功能也有裁剪。   嵌入式linux系统多用于定制开发专用设备,功能可能比较固定,对于不同的行业,根据需求对软硬件进行裁剪选配,这也是嵌入式linux系统广泛应用的特点之一。 C语言即可入门   嵌入式linux开发,大多是是使用C或者C++,底层内核代码大部分是C语言实现,驱动代码也是C语言,内核提供的系统API都是C语言接口,对于会C语言编程的同学来说,入门还是很容易的。 命令行   关于linux命令行;使用linux系统,就少不了与命令行打交道,其实命令行在linux开发中,是与系统沟通的最主要方式!所以需要去熟悉常用的命令,常用的并不多,经过一段时间使用也很容易掌握,这些命令在PC端和设备端基本上是一样的,比如:文件/目录操作、网络配置、磁盘管理等;这些命令也都是C语言实现的,在嵌入式linux系统中,这些命令都来自于busybox(工具集),感兴趣可以去busybox里看看命令的实现!代码很简洁,命令的设计也体现了linux设计思想:简单;一个命令只完成一个功能,通过不同的命令相互组合,就可以实现复杂的功能! 网络   说到linux不得不提的是其强大的网络功能,所以对于需要用到网络通信的需求方案来说,这是个很好的选择,如果使用单片机做网络通信,是比较麻烦的,TCP/IP协议栈都是个问题,linux有完整的网络通信功能,而且很容易加上WIFI、4G等通信方式。 远程运维   基于网络,嵌入式linux系统很容易实现远程运维,可以通过内网穿透技术、或者基于ssh2协议实现远程跨公网访问设备,这对于开发人员测试、调试、升级、问题查找等很方便;远程传输文件也很方便,可以使用ftp、scp、wget、xmodule等方式。 成本   随着技术发展,芯片的价格也在不断下降,嵌入式linux系统硬件成本也在不断下降,使得其应用的更加广泛,对于简单的控制,还是单片机的市场。 微信公众号:
个人分类: Linux|1 次阅读|0 个评论
分享 linux drwxr-xr-x 是什么意思
wateras1 2018-4-2 10:24
linux drwxr-xr-x 第一位表示文件类型。d是目录文件,l是链接文件,-是普通文件,p是管道 第2-4位表示这个文件的属主拥有的权限,r是读,w是写,x是执行。 第5-7位表示和这个文件属主所在同一个组的用户所具有的权限。 第8-10位表示其他用户所具有的权限。 root@Widora:/# ls -al drwxr-xr-x 1 root root 0 Jan 1 1970 . drwxr-xr-x 1 root root 0 Jan 1 1970 .. drwxr-xr-x 2 root root 907 Mar 20 11:04 bin drwxr-xr-x 5 root root 1120 Mar 20 11:05 dev drwxr-xr-x 1 root root 0 Mar 20 11:02 etc drwxr-xr-x 12 root root 880 Mar 20 10:56 lib drwxr-xr-x 2 root root 3 Mar 20 11:02 mnt drwxr-xr-x 5 root root 0 Jan 1 1970 overlay dr-xr-xr-x 46 root root 0 Jan 1 1970 proc drwxr-xr-x 16 root root 223 Mar 20 11:04 rom drwxr-xr-x 2 root root 3 Mar 20 11:02 root drwxrwxr-x 2 root root 810 Mar 20 11:04 sbin dr-xr-xr-x 11 root root 0 Jan 1 1970 sys drwxrwxrwt 17 root root 440 Mar 20 11:06 tmp drwxr-xr-x 1 root root 0 Mar 20 11:00 usr lrwxrwxrwx 1 root root 4 Mar 20 11:04 var - /tmp drwxr-xr-x 7 root root 120 Mar 20 11:04 www
个人分类: MTK7688/7628 openwrt alexa|965 次阅读|0 个评论
分享 Linux学习日志(17)- 关于Makefile
懒猫爱飞 2017-3-30 17:56
Linux学习日志(17)- 关于Makefile
Makefile 是啥东东,如果在 windows 下开发单片机或其它程序用 IDE 用习惯了,可能对这个 makefile 是一头雾水。 Makefile 是一个文件,它定义了定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,在 windows 下 IDE 开发, IDE 中已隐藏了包含了 makefile 文件,但在 linux 下,我的地盘我做主,编写 makefile 是 linux 世界编程不可回避的话题。 Make 是 20 世纪 70 年代发明的编程项目编译的辅助工具, make 的编译思路很简单,如果源程序发生了改变,并需要重新构建程序或才其它输出文件时, make 会先查看时间截哪些改变了,并按照要求重新构建这些文件,而不会浪费时间重新构建其它文件。 GNU make 是 make 工具的 GNU 版本(关于 GNU 是什么,我觉得学习 linux 人都应该知道 ^_^ ),它已成为工业标准,它属于自由软件,目前非常流行。 小知识 ? GNU 计划,又称革奴计划,是由 Richard Stallman 在 1983 年 9 月 27 日公开发起的。它的目标是创建一套完全自由的操作系统。 Richard Stallman 最早是在 net.unix-wizards 新闻组上公布该消息,并附带《 GNU 宣言》等解释为何发起该计划的文章,其中一个理由就是要“重现当年软件界合作互助的团结精神”。为保证 GNU 软件可以自由地“使用、复制、修改和发布”,所有 GNU 软件都有一份在禁止其他人添加任何限制的情况下授权所有权利给任何人的协议条款, GNU 通用公共许可证( GNU General Public License , GPL )。即“反版权”(或称 Copyleft )概念。 -- 来源 . 百度百科 在终端输入 make 命令就会调用 make 工具, make 会在当前目录按照文件名顺序寻找 makefile 文件,依次按照: GNUmakefile,makefile,Makefile 查找,如果找到其中的任何一个,就读取并按照其中的规则执行,否则报错。 小提示 ! 在网上流传一份《跟我一起写 Makefile 》,作者是:陈皓,很适合新新学习,下面这个网址也可以看看: http://wiki.ubuntu.org.cn/%E8%B7%9F%E6%88%91%E4%B8%80%E8%B5%B7%E5%86%99Makefile:MakeFile%E4%BB%8B%E7%BB%8D 打铁还要自身硬,想深入学习 linux 还是要学好基本功,好吧,现在跟着一个小程序,总结一下 makefile 。 1 .目标 写一个 hello.c, 使程序输出 hello,Ubuntu!, 创建 Makefile 文件,输入以下内容并保存。 all: gcc hello.c 注意 gcc hello.c 前面是 tab 键空出的缩进,不能用空格键代替。 然后执行命令: make ,生成以下文件: mark@ubuntu:/mnt/hgfs/0_VMwareShare/c_learn/lesson001$ ls -l 总用量 9 -rwxrwxrwx 1 root root 7344 3 月 30 12:47 a.out -rwxrwxrwx 1 root root 82 3 月 30 12:46 hello.c -rwxrwxrwx 1 root root 18 3 月 30 12:47 Makefile 执行命令: ./a.out, 输出以下内容: mark@ubuntu:/mnt/hgfs/0_VMwareShare/c_learn/lesson001$ ./a.out Hello ubuntu! Makefile 的基本语法格式是: target : prerequisites command ? target 是编译目标,在编译的时候输入 make target 就可以执行 target 规则。 Target 既可以是上档文件,也可以是可执行文件,还可以是一个标签,如前面写的 Makefile 中的 all 。 ? prerequisites 是依赖关系文件,即生成 target 所需要的文件或目标。 ? command 是生成 target 所需要的命令 makefile 会根据时间戳来决定哪些文件需要重新编译,对于为个规则来说明一下,如果 prerequisites 中如果有一个以上的文件比 target 文件更新的话,则 command 所定义的命令就会被执行。 再回头看一下 hello.c 的 Makefile 文件内容: all: gcc hello.c 整个 Makefile 只定义了一个目标 all, 也没有任何依赖关系, all 目标对应的命令为 gcc hello.c, 这个目标 all 是一个标签,也是第一个目标,将第一个目标设置为 all 是一个习惯,当然可以改为任何一个标签。终端输入 make ,不指定任何编译目标,默认执行第一个标签的规则,也就是说输入 make 和 make all 实际上是赞同的。 2 .伪目标 假如一个目标名与当前目录下的某一个文件名相同,那么 make 的时候会出现什么情况?好吧,实践出真知,操作一下应知道了 ^_^ mark@ubuntu:/mnt/hgfs/0_VMwareShare/c_learn/lesson001$ cp a.out all mark@ubuntu:/mnt/hgfs/0_VMwareShare/c_learn/lesson001$ ls -l 总用量 16 -rwxrwxrwx 1 root root 7344 3 月 30 13:09 all -rwxrwxrwx 1 root root 7344 3 月 30 12:47 a.out -rwxrwxrwx 1 root root 82 3 月 30 12:46 hello.c -rwxrwxrwx 1 root root 18 3 月 30 12:47 Makefile mark@ubuntu:/mnt/hgfs/0_VMwareShare/c_learn/lesson001$ make make: 'all' is up to date. mark@ubuntu:/mnt/hgfs/0_VMwareShare/c_learn/lesson001$ 把刚才生成的 a.out, 复制一份,命名为 all, 然后再 make 。可以看到提示信息是“ all ”是最新的,根据 make 处理流程,“是最新的”意味着 all 目标对应的规则永远不会被执行,哪怕实际需要编译的文件已经修改过,也不会被重新编译。 如果程序在编写时 Makefile 的时候,一不小心出现这种问题,那么对程序的编译是致命的,针对这种情况, Makefile 有一个解决办法,引入了一个新的目标 — 伪目标。伪目标是一个标签,这个目标只执行命令,不创建目标,避免目标与工作目录下的实际文件名冲突。 伪目标的写法如下所示: .PHONY: 标签 对于前面这个例子,将 Makefile 文件稍微修改一下,在末尾增加一行: .PHONY:all 代码如下所示: all: gcc hello.c .PHONY:all 将 all 设置为伪目标后,尽管当前目录下有同名为 all 文件,但在终端输入 make 命令, all 的命令会被正确执行。 在实际应用中,通常会有一个 clean 目标,这个目标几乎都会被设置为伪目标,用于清除编译产生的中间文件和可执行文件。在进行源文码打包或才发布的时候,先通过 make clean 命令清除,可以得到干净的代码文件。 继续在 hello.c 的 Makefile 文件中增加一个伪目标 clean, 如下所示: .PHONY:clean -rm –v a.out( 注意前面用是的 tab 做的缩进 ) clean 对应的命令是 -rm –v a.out, 就是一个普通的删除命令,加 -v 参数是显示删除列表。完整的 Makefile 如下所示: .PHONY:all clean all: gcc hello.c clean: -rm -v a.out 如果一个 Makefile 文件有多个伪目标,则可以分多行单独声明,也可以将多个目标一并声明,各伪目标之间用空格隔开。 clean 伪目标的命令为 -rm ,如果在 rm 命令前加“ - ”,含义是如果这条命令执行失败, make 将忽略这个错误,继续往下执行;如果不加“ - ”,则 make 停止。一个工程连续两次 make clean 后,那么第二次 clean 的时候,由于相关文件已经不存在,在加了“ - ”的情况下, clean 会提示出错,但被忽略,而不加“ - ”则不忽略。“ - ”的含义不仅仅对 rm 命令有效,对 Makefile 中的所有命令都有效,安等于 make –i 命令。 3 .自定义变量 make 支持在 Makefile 文件中定义变量,合理使用变量,能增加 Makefile 文件的通用性,并简化 Makefile 文件编写。一般的 Makefile 文件编写中,通常会为源文件、可执行文件以及编译参数等分别定义一个变量,并予以赋值,在编译规则中直接引用这些变量。 变量的定义和赋值方法通常如下所示: VAR = value 在用到变量的地方,通过符号“ $ ”和“()”一起来完成变量引用,如 $(VAR) 。 对于 hello.c 的 Makefile 文件,如果定义源文件 SRC 和可执行文件 EXE 两个变量,对 Makefile 文件进行如下修改: # makefile for hello.c EXE = hello SRC = hello.c .PHONY:clean all all: gcc -o $(EXE) $(SRC) clean: -rm -v $(EXE) 使用了自定义变量后,只需要将 EXE 和 SRC 两个变量进行修改,即可将这个 Makefile 文件用于其它文件编译,增强了通用性与可移植性。 如果变量的赋值有多个值,可直接在等号 (=) 后面列出,如下所示: SRC = hello.c test.c tmp.c 赋值除了直接用 = 号外,可以使用追加符号“ += ”进行追加,例如: SRC = hello.c SRC += test.c tmp.c SRC += hello2.c 如果赋值很长可以用换行符号“ \ ”进行换行处理,例如: SRC = hello.c \ Test.c \ Temp.c 可以在 Makefile 中加注释,对文件或者其中一些变量、规则进行说明,有助于文件的阅读与理解,注释行以“ # ”号开始并顶格。 4 . Makefile 变量 Make 本身有一些特殊变量可以在 Makefile 中使用,能进一步简化 makefile 文件的编写。这些特殊变量包括环境变量、自动变量和预定义变量。 环境变量 就是系统的环境。 Makefile 中基本可以直接引用几乎所有的环境变量,比如代表当前登录用户的 USER ,系统外部命令搜索路径 PATH 等,这些变量可以直接以 $(VAR) 的方式引用。 但是 make 对环境变量的处理有一个例外,就是 shell,make 在默认情况下会指定 Shell 为“ /bin/sh ”,而不是使用用户指定的其它用于交互的 shell 。 另外还有一个可以直接引用但需要小心使用的环境变量 -PWD , PWD 的值是 make 开始运行时的路径。但是,它可能与 make 当前正在解释执行的 Makefile 文件所在的路径不一致,不能认为它一定就是 Makefile 所在的路径。 如果在 Makefile 中定义了一个与系统环境变量同名的自定义变量,则自定义会覆盖系统变量的值,这点一定要注意。 自动变量 不用定义,且会随着上下文的不同而发生改变。 Make 的自动变量都是一些比较难记信的符号,都以“ $ ”符号开头。使用了自动变量的 Makefile 文件读起来会显得抽象生涩一些。常用的 make 自动变量如下所示: ? $@ 规则的目标文件名 ? $ 规则的目标的第一个依赖文件名 ? $^ 规则的目标所对应的所有依赖文件的列表,以空格分隔 ? $? 规则的目标对应的依赖文件新于目标文件的文件列表,发空隔分开 ? $(@D) 规则的目标文件的目录部分(如果目标在子目录中) ? $(@F) 规则的目标文件的文件各部分 ( 如果目标在子目录中 ) 在前面例子的基础上增加一个源文件 hello1.c, 更改一下 Makefile 文件,添加一下自动变量, Makefile 文件修改如下所示: 1 # makefile for hello.c 2 EXE = main 3 OBJ = hello.o hello1.o 4 SRC = hello.c hello1.c 5 6 EXE:$(OBJ) 7 gcc -o $(EXE) $^ 8 9 .PHONY:clean 10 11 clean: 12 -rm -v $(EXE) 修改后的 Makefile 增加了以下几点内容: F 增加了目标和依赖关系 F 编译多个 C 文件,多个文件用空格隔开 F 使用了自动变量 第 6 行 EXE:$(OBJ) ,是说可执行文件依赖于目标文件,目标文件有更新,因此才会重新编译生成可执行文件。编译命令也用了自动变量 $^, 在这里对应所有生成的目标文件。可执行文件名不一定要和源文件相同或者有关系,可以任意取,在这个例子中将可执行文件名设置为 main 。这个 Makefile 的 make 结果如下所示: mark@ubuntu:/mnt/hgfs/0_VMwareShare/c_learn/lesson001$ make gcc -o main hello.o hello1.o mark@ubuntu:/mnt/hgfs/0_VMwareShare/c_learn/lesson001$ ls -l 总用量 20 -rwxrwxrwx 1 root root 7344 3 月 30 14:08 hello -rwxrwxrwx 1 root root 90 3 月 30 14:43 hello1.c -rwxrwxrwx 1 root root 1052 3 月 30 14:43 hello1.o -rwxrwxrwx 1 root root 82 3 月 30 12:46 hello.c -rwxrwxrwx 1 root root 1072 3 月 30 14:43 hello.o -rwxrwxrwx 1 root root 7396 3 月 30 15:33 main -rwxrwxrwx 1 root root 147 3 月 30 15:33 Makefile 自动变量 用于定义程序名称及传递给这些程序的参数和标志位等。常见的预定义变量和描述如下所示: ? AR 归档维护程序,默认值为 ar ? AS 汇编程序,默认值为 as ? CC C 语言编译程序,默认值为 cc ? CPP C 语言预处理程序,默认为 cpp ? RM 文件删除程序,默认值为 rm –f ? ARFLAGS 传递给 AR 程序的标志,默认值为 rv ? ASFLAGS 传递给 AS 程序的标志,默认值无 ? CFLAGS 传递给 CC 程序的标志,默认值无 ? CPPFLAGS 传递给 CPP 程序的标志,默认值无 ? LDFLAGS 传递给链接程序的标志,默认值无 利用自动变量,再次修改 Makefile 文件,如下所示: # makefile for hello.c EXE = main OBJ = hello.o hello1.o SRC = hello.c hello1.c CC = gcc CFLAGS = -o LDFLAGS = -L . -lFOO EXE:$(OBJ) # gcc -o $(EXE) $^ $(CC) $(CFLAGS) $(EXE) $^ .PHONY:clean clean: # -rm -v $(EXE) -$(RM) $(OBJ) $(EXE) 再次编译一下,结果如下所示: 由结果可以看出,能过预定义变量传递的参数全部生效了 ^_^ 5 .隐式规则和显式规则 前面修改的 Makefile 文件中 EXE:$(OBJ) , EXE 依赖于 OBJ ,但是整个 Makefile 只定义了 EXE 的生成规则,并没有给出 OBJ 的生成规则,但为什么编译却没有出错呢? 这是因为 make 有一些既定的目标生成规则,称之为隐式规则,例如对于一个 file.o 的文件, make 会优先寻找同名的 file.c 文件,并按照 gcc –c file.c –o file.o 的编译规则生成 file.o 文件。对于不同的编程语言,有不同的隐式规则,所以一般来说,不推荐用隐式规则。 显式规则是用户自定义的规则,在使用隐式规则有隐患的情况下,更应该使用显式规则,明确指定生成规则,例如前面提到的隐式规则,用显式规则来定义如下所示: OBJ:$(SRC) $(CC) –o $(OBJ) –c $^ 如果不用自定义变量,还可以这么写,为称为模式规则: %.o:%.c $(CC) –o $(OBJ) –c $@ 到现在为止,已经得到一个基本比较完整的 Makefile 文件。只要修改文件的头三个变量,就能用于其它工程编译,这也可以说是一个基本 Linux 应用程序 Makefile 文件的框架。 6 . make 命令 一个工程编写了 Makefile 文件后,通常只需要在当前目录下输入 make 命令即可完成编译。然而实际上 make 命令本身可以接受参数的,完整的用法如下所示: make 选项可以指定 make 的工作行为,宏定义可以指定执行 Makefile 的宏值,目标则是 Makefile 中的目标,包含伪目标,这些参数是可选的,各参数之间用空格隔开。 Make 常见参数如下所示: 选项 说明 -C dir 指定 make 开始运行之后的工作目录为 dir ,默认为当前目录 -d 打印除一般处理信息之外的调试信息,例如进行比较的文件的时间,尝试的规则等。 -e 不允许在 makefile 中对环境变量赋新值,即丢弃与环境变量同名的自定义变量 -f file 使用指定文件 file 为 makefile 文件 -i 忽略 makefile 运行时命令产生的错误,不退出 make -I dir 指定 makefile 运行时的包含目录,多个包含目录用空格分隔 -S 执行 makefile 时遇到错误即退出,这是 make 的默认工作方式,无需指定 -v 打印 make 版本号 Makefile 编写上是一个复杂的工作, Makefile 还有很多复杂和灵活的语法,这里不多总结了,以后用到了再记录吧。如果有空想深入了解,可以参看 GNU 的 makefile Manual^_^ 最后,再吼一下俺的口号: 每天进步一点点,开心多一点 ^_^ --2017年3月30日 17:56:27
个人分类: linux学习日志|1246 次阅读|0 个评论
分享 Linux学习日志(6) - Vmware 虚拟机ubuntu安装JDK
懒猫爱飞 2017-3-21 16:54
版权声明:本文为博主原创文章,未经博主允许不得转载,交流QQ:2912615383 1、Java8 下载地址 JDK下载地址 http://www.oracle.com/technetwork/cn/java/javase/downloads/jdk8-downloads-2133151-zhs.html 2 、将 jdk-8u112-linux-x64.tar.gz 下载到桌面或其它文件夹 打开终端执行解压命令,并拷贝到/opt目录下 mark@mark:~$ cd 桌面 mark@mark:~/ 桌面 $ ls -l 总用量 178920 -rwxrw-rw- 1 mark mark 183212596 3 月 6 19:07jdk-8u112-linux-x64.tar.gz 下面的操作命令用的ROOT账户 mark@mark:~/ 桌面 $ sudo su root@mark:/home/mark/ 桌面 # tar zxvf jdk-8u112-linux-x64.tar.gz -C /opt 切换到/opt文件夹下查看: root@mark:/home/mark/ 桌面 # cd /opt root@mark:/home/mark/ 桌面 # ls -l 3 、在 /bin 目录下创建 Java 软链接 root@mark:/opt# cd /bin root@mark:/bin# ln -s/opt/jdk1.8.0_112/bin/java java root@mark:/bin# java -version java version "1.8.0_112" Java(TM) SE Runtime Environment (build 1.8.0_112-b15) Java HotSpot(TM) 64-Bit Server VM (build 25.112-b15, mixedmode) 4 、 设置 Java 环境 root@ mark:/bin# gedit /etc/profile 在 profile 中添加如下内容: export JAVA_HOME=/opt/jdk1.8.0_112 export JRE_HOME=${JAVA_HOME}/jre export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib export PATH={JAVA_HOME}/bin:$PATH 更新profile root@mark:/bin# source /etc/profile 5. 验证 root@mark:/bin# echo $JAVA_HOME /opt/jdk1.8.0_112 root@zhenqi-virtual-machine:/bin# java –version java version "1.8.0_112" Java(TM) SE Runtime Environment (build 1.8.0_112-b15) Java HotSpot(TM) 64-Bit Server VM (build 25.112-b15, mixedmode) 然后可以编写一个小程序测试一下,应该是没有问题了。 最后,再吼一下俺的口号: 每天进步一点点,开心多一点^_^ --2017年3月8日 16:08:44
个人分类: linux学习日志|537 次阅读|0 个评论
分享 Linux学习日志(5) - am335x开发BootLoad的makefile学习
懒猫爱飞 2017-3-21 16:52
版权声明:本文为博主原创文章,未经博主允许不得转载,交流QQ:2912615383 公司的项目,处理器用的是AM335X,核心板是用深圳某家公司的,所以要学习linux,俺对linux是个大白,但项目所驱使,不得不学,这两天在vmware上折腾安装ubuntu16.04, 先安装的是64位的系统,用着也是蛮爽的,可是在安装ARM交叉编译环境时会报错,按照给的文档安装还是出错,于是重新安装系统,还是会出错,最后没办法找售后,售后折腾 了一下行,说别的客户没有这个问题,然后,这样指导一下让我试试,那样指导一下让我试试,搞了一下午也没有搞定。 晚上7点多的时候,售后说可能是系统的问题(不得不说售后这人还是蛮负责的,点个赞 ),我一看我的是64位系统,可能与系统有关,今天果断安装ubuntu 16.04 32bit,再次安装交叉编译环境,一次OK,非常完美。 然后按文档中写的步骤,试着编译了一下例程,编译没有问题,可以没找到生成了bin文件,于是又开始上网查资料,问网友,最后终于知道原来是生成在了别的目录…… 后来研究了一下makfile文件,果真是设置在了别的文件夹下,哎,怪自己是生人,当然,文档中没有指明也是一大失误,毕竟我是新手,好多地方可能会忽略,好吧,不说了, 把bootloader的makefile贴出来,学习一下吧,这个是裸机程序用的bootloader,不是uboot,后面日志中会记录关于uboot的学习。 # #Locatingtherootdirectory #定位到starterware的根目录,ROOT是声明的变量 # ROOT=../../../../../../ # #DeviceandEVMdefinitions #定义设备和开发板版本,用于路径搜索 #DEVICE与EVM是声明的变量 # DEVICE=am335x EVM=beaglebone # #Includethemakefiledefinitions.Thiscontainscompiler,linkerand #archiverdefinitionsandoptions #包含makedefs文件,该文件内定义了相关路径 #${ROOT}是调用变量 # include${ROOT}/build/armv7a/gcc/makedefs # #TargetDirectoriesthatneedtobebuilt #指定编译所依赖的文件路径,该路径在上述makedefs中被定义 # DIRS=${DRIVERS_BLD}${PLATFORM_BLD}${UTILITY_BLD}${MMCSDLIB_BLD}${NANDLIB_BLD} # #Theapplicationdirectoryandname #指定生成的文件名 # APPDIR=bootloader APPNAME=boot # #WherethebootloaderwillbeloadedtobytheROMcode #starting1Kbytecannotbeusedduetohardwarelimitation #生成的文件被装载的空间,重要的变量 START_ADDR= 0x402F0400 # #ApplicationLocation # APP=${ROOT}bootloader/ APP_BIN=${ROOT}/binary/${TARGET}/${COMPILER}/${DEVICE}/sbc8600/$(APPDIR) # #Applicationsourcefiles #应用源文件 # COMMON=$(APP)src/bl_main.c\ $(APP)src/bl_am335x.c\ $(APP)src/bl_copy.c\ $(APP)src/bl_pmI2c.c\ $(APP)src/bl_pmic.c\ $(APP)src/$(TARGET)/gcc/*.S # #如果是从SD卡启动,则需要编译下面的源文件 # ifeq($(BOOT),MMCSD) SOURCE=$(APP)/src/bl_hsmmcsd.c\ $(FATFS_SRC)/src/ff.c\ $(FATFS_SRC)/port/fat_mmcsd.c endif # #如果是从UART卡启动,则需要编译下面的源文件 # ifeq($(BOOT),UART) SOURCE=$(APP)/src/bl_uart.c\ ${ROOT}/third_party/xmodem/xmodem.c\ ${ROOT}/third_party/xmodem/crc16.c endif APP_SRC=$(SOURCE)$(COMMON) # #Requiredlibraryfiles #所需要的库文件 # APP_LIB=-ldrivers\ -lutils\ -lplatform\ -lmmcsd # #Rulesforbuildingtheapplicationandlibrary #运行编译 # all:debugrelease debug: makeTARGET_MODE=debuglib makeTARGET_MODE=Debugbin release: makeTARGET_MODE=releaselib makeTARGET_MODE=Releasebin lib: @for i in ${DIRS};\ do\ if ;\ then\ make$(TARGET_MODE)-C i | | e x i t ?;\ fi;\ done; bin: $(CC)$(CFLAGS)$(APP_SRC) @mkdir -p$(TARGET_MODE)/ @mv *.o*$(TARGET_MODE)/ $(LD)${LDFLAGS}${LPATH}-o$(TARGET_MODE)/$(APPNAME).out-Map$(TARGET_MODE)/$(APPNAME).map\ $(TARGET_MODE)/*.o--defsymBOOT_START_ADDR=$(START_ADDR)-T$(APPNAME).lds$(APP_LIB)-lc-lgcc$(APP_LIB)-lc-lgcc @mkdir -p$(APP_BIN)/$(TARGET_MODE) @cp $(TARGET_MODE)/$(APPNAME).out$(APP_BIN)/$(TARGET_MODE)/$(APPNAME).out $(BIN)$(BINFLAGS)$(APP_BIN)/$(TARGET_MODE)/$(APPNAME).out\ $(APP_BIN)/$(TARGET_MODE)/$(APPNAME).bin cd$(ROOT)/tools/ti_image/;gcctiimage.c-oa.out;cd- $(ROOT)/tools/ti_image/a.out$(START_ADDR)$(BOOT)\ $(APP_BIN)/$(TARGET_MODE)/$(APPNAME).bin\ $(APP_BIN)/$(TARGET_MODE)/$(APPNAME)_ti.bin;rm-rf$(ROOT)/tools/ti_image/a.out; # #Rulesforcleaning # clean: @rm -rfDebugRelease$(APP_BIN)/Debug$(APP_BIN)/Release clean+:clean @make TARGET_MODE=cleanlib 水平有限,只能注释这么多了, 在网上下了《跟我一起学习makefile》,正在学习,这次先做个笔记,慢慢研究。 最后,再吼一下俺的口号: 每天进步一点点,开心多一点^_^ --2017年3月8日 15:39:38
个人分类: linux学习日志|814 次阅读|0 个评论
分享 Linux学习日志(4) - vim学习总结
懒猫爱飞 2017-3-21 16:49
版权声明:本文为博主原创文章,未经博主允许不得转载,交流QQ:2912615383 Vim 是一个类似于 Vi 的著名的功能强大、高度可定制的 文本编辑器 ,在Vi的基础上改进和增加了很多特性。VIM是 自由软件 。 Vim 普遍被推崇为类 Vi 编辑器 中最好的一个,事实上真正的劲敌来自Emacs的不同变体。1999 年 Emacs 被选为Linuxworld文本编辑分类的优胜者,Vim屈居第二。但在2000年2月Vim赢得了Slashdot Beanie的最佳 开放源代码 文本编辑器大奖,又将Emacs推至二线, 总的来看, Vim和Emacs同样都是非常优秀的文本编辑器。 基本上vi 可以分为三种状态,分别是一般模式、编辑模式和命令行模式,各模式的功能区分如下: 1) 一般模式: 以vi 打开一个文件就直接进入一般模式了(这是默认的模式)。在这个模式中, 你可以使用上下左右按键来移动光标,你可以使用删除字符或删除整行来处理文件内容,也可以使用复制、粘贴来处理你的文件数据。 2) 编辑模式: 在一般模式中可以进行删除、复制、粘贴等的操作,但是却无法编辑文件的内容,只有当到你按下【i, I, o, O, a, A, r, R 】等任何一个字母之后才会进入编辑模式。这时候屏幕的左下方会出现【INSERT或 REPLACE】的字样,此时才可以进行编辑。而如果要回到一般模式时,则必须要按下【Esc】即可退出编辑模式。 3) 命令行模式: 输入【 : / ? 】三个中的任何一个,就可以将光标移动到最底下那一行。在这个模式中,可以提供查找、读取、存盘、替换字符、离开vi、显示行号等的动作则是在此模式中完成的! 关于VI的学习可以用命令man vi来查询 图1man命令打印的vim说明 VI的用法很多,现总结一下常用的vim用法: 进入vi的命令 vi filename:打开或新建文件,并将光标置于第一行首; vi +n filename:打开文件,并将光标置于第n行首; vi + filename:打开文件,并将光标置于最后一行首; vi +/pattern filename:打开文件,并将光标置于第一个与pattern匹配的串处; vi -r filename:在上次正用vi编辑时发生系统崩溃,恢复filename; vi filename….filename:打开多个文件,依次进行编辑。 移动光标类命令 Backspace(或者h):光标左移一个字符; space(或者l):光标右移一个字符; k(或Ctrl+p):光标上移一行; j(或Ctrl+n,或Enter):光标下移一行; w(或W):光标右移一个字至字首; b(或B):光标左移一个字至字首; e(或E):光标右移一个字至字尾; ):光标移至句尾; (:光标移至句首; }:光标移至段落开头; {:光标移至段落结尾 nG:光标移至第n行首; n+:光标下移n行; n-:光标上移n行; n$:光标移至第n行尾; H:光标移至屏幕顶行; M:光标移至屏幕中间行; L:光标移至屏幕最后行; 0:(注意是数字零)光标移至当前行首; $:光标移至当前行尾。 插入文本类命令 i:在光标前插入; a:光标后插入; I:在当前行首插入; A:在当前行尾插入; o:在当前行之下新开一行; O:在当前行之上新开一行; r:替换当前字符; R:替换当前字符及其后的字符,直至按ESC键; s:从当前光标位置处开始,以输入的文本替代指定数目的字符; S:删除指定数目的行,并以所输入文本代替之; ncw或nCW:修改指定数目的字; nCC:修改指定数目的行。 删除命令 x或X:删除一个字符,x删除光标后的,而X删除光标前的; ndd:删除当前行及其后n-1行; ndw或ndW:删除光标处开始及其后的n-1个字; do:删至行首; d$:删至行尾; Ctrl+u:删除输入方式下所输入的文本。 屏幕翻滚类命令 Ctrl+f:向文件尾翻一屏; Ctrl+b;向文件首翻一屏; Ctrl+u:向文件首翻半屏; Ctrl+d:向文件尾翻半屏; nz:将第n行滚至屏幕顶部,不指定n时将当前行滚至屏幕顶部。 搜索及替换命令 /pattern:从光标开始处向文件尾搜索pattern; ?pattern:从光标开始处向文件首搜索pattern; n:在同一方向重复上一次搜索命令; N:在反方向上重复上一次搜索命令; : s/p1/p2/g:将当前行中所有p1均用p2替代; : n1,n2s/p1/p2/g:将第n1至n2行中所有p1均用p2替代; : g/p1/s//p2/g:将文件中所有p1均用p2替换。 选项设置 all:列出所有选项设置情况; term:设置终端类型; ignorance:在搜索中忽略大小写; list:显示制表位(Ctrl+I)和行尾标志($); number :显示行号 ; report:显示由面向行的命令修改过的数目; terse:显示简短的警告信息; warn:在转到别的文件时若没保存当前文件则显示NO write信息; nomagic:允许在搜索模式中,使用前面不带“”的特殊字符; nowrapscan:禁止vi在搜索到达文件两端时,又从另一端开始; mesg:允许vi显示其他用户用write写到自己终端上的信息。 命令 : w :保存当前文件; : e filename :打开文件filename 进行编辑; : x :保存当前文件并退出; : q :退出vi ; : q! :不保存文件并退出vi ; : n1,n2 co n3:将n1行到n2行之间的内容拷贝到第n3行下; : n1,n2 m n3:将n1行到n2行之间的内容移至到第n3行下; : n1,n2 d:将n1行到n2行之间的内容删除; : !command:执行shell命令command; : n1,n2w!command:将文件中n1行至n2行的内容作为command的输入并执行之,若不指定n1,n2,则表示将整个文件内容作为command的输入; : r!command:将命令command的输出结果放到当前行。 寄存器操作 "?nyy:将当前行及其下n行的内容保存到寄存器?中,其中?为一个字母,n为一个数字; "?nyw:将当前行及其下n个字保存到寄存器?中,其中?为一个字母,n为一个数字; "?nyl:将当前行及其下n个字符保存到寄存器?中,其中?为一个字母,n为一个数字; "?p:取出寄存器?中的内容并将其放到光标位置处。这里?可以是一个字母,也可以是一个数字; ndd:将当前行及其下共n行文本删除,并将所删内容放到1号删除寄存器中。 当然vim还有很多插件可以用,有兴趣的童鞋可以度娘一下哦^_^ 最后,再吼一下俺的口号: 每天进步一点点,开心多一点^_^ --2017年3月6日 13:22:57
个人分类: linux学习日志|565 次阅读|0 个评论
分享 Linux学习日志(3) - Vmware 虚拟机ubuntu安装usb转串口
懒猫爱飞 2017-3-21 16:46
1、虚拟机添加串口 关闭虚拟机的系统 选择虚拟机---设置---硬件---添加---串行端口---按以理设置操作: 图1选择串口端口 图2使用物理串口 图3选择自动检测 2、安装minicom [mark@mark]$ sudo apt-getinstall minicomm 3、设置串口 [mark@mark]$ sudominicom -s 图4 minicom设置项 用上下键或J、K键进行选项操作,选中serial portsetup点击ENTER 图5串口设置 输入相应的字母,进行对应项的设置,例如输入A,则进行serial device设置 因为我用的是usb转串口线,所以我把默认的tty0更改成了ttyUSB0。 查看驱动安装情况:[mark@mark]$ lsmod 图6串口驱动 查看终端设备:[mark@mark]$ ls /dev/tty* 图7挂载的终端设置 4、打开串口 [mark@mark]$ sudominicom 图8串口运行情况 5、注:minicom中有用的功能 命令帮助—“Ctrl A”后按“Z” 清屏--“Ctrl A”后按“C” 设置--“Ctrl A”后按“O” 发送文件--“Ctrl A”后按“S” 退出--“Ctrl A”后按“Q” 6、我用的是ubuntu 16.04 ,不同的系统下可能显示的不太一样,但操作基本一致。 最后,再吼一下俺的口号: 每天进步一点点,开心多一点^_^ --2017年3月6日 12:22:49
个人分类: linux学习日志|675 次阅读|0 个评论
分享 Linux学习日志(2) - 笔记本VMware下安装ubuntu 16.04窗口显示不全的问题
懒猫爱飞 2017-3-21 16:45
在VMware安装ubuntu 16.04,默认的像素是800*600,对于笔记本来说,安装窗口会显示不全,下面的按钮会显示不全,特别是到了挂载分区的时候,没法点击下一步,我用TAB按键试,好像也是不行,非常尴尬,问了一下网友,有人建议默认的分区方式,但这样安装下来,分区不太符合自己的要求,于是找其它的方法。 功夫不付有心人,在经过多次尝试以后,终于找到了方法,现在记录一下,以备不时之需: 1、在安装ubuntu时,先点击试用ubuntu,而不是安装 2、当试用进入系统后更改屏幕像素,我是笔记本,像素更改为1440*900,按钮刚好显示完全,每台显示器可能略有不同,另外比较关键的是,在启动器布局一项中, 一定要选择 "unknown Display" ,否则不支持tab键 图1 启动器布局选项 3、然后用键盘上的tab键,按5下左右,点击enter确定,像素就更改过来了,然后保存设置 4、点击桌面上的ubuntu系统,进行安装,后面就要吧看到安装窗口的操作按钮了 最后,再吼一下那句久违的口号: 每天进步一点点,开心多一点^_^ --2017年3月6日 10:23:18
个人分类: linux学习日志|995 次阅读|0 个评论
分享 linux学习日志(1) - ubuntu文件结构
懒猫爱飞 2017-3-21 16:44
公司要上新项目,要用到linux,周末抽空把系统上安装了虚拟机及ubuntu16.04系统 先来学习一下ubuntu文件结构,部分内容来源于网络 1.文件系统类型 windows中常见的磁盘格式有fat16、fat32和ntfs。windows是一个封闭的系统。无法打开ext3或者mac日志式。 在ubuntu中其文件系统广泛使用ext3(ext4是ext3的扩展)的文件格式,从而实现了将整个硬盘的写入动作完整的记录在磁盘的某个区域上。而且在ubuntu中可以实现主动挂载 windows的文件系统,并以只读的方式访问磁盘中windows系统上的文件。 在ubuntu中磁盘文件系统、网络文件系统都可以非常方便的使用,而屏蔽了网络和本地之间的差异。在ubuntu中所有的文件都是基于目录的方式存储的。一切都是目录,一切都是文件。 2.文件系统结构 /:是一切目录的起点,如大树的主干。其它的所有目录都是基于树干的枝条或者枝叶。在ubuntu中硬件设备如光驱、软驱、usb设备都将挂载到这颗繁茂的枝干之下,作为文件来管理。 图1 要目录下文件 /bin: bin是Binary的缩写。存放系统中最常用的可执行文件(二进制)。 /boot:这里存放的是linux内核和系统启动文件,包括Grub、lilo启动器程序。 /dev: dev是Device(设备)的缩写。该目录存放的是Linux的外部设备,如硬盘、分区、键盘、鼠标、usb等。 /etc:这个目录用来存放所有的系统管理所需要的配置文件和子目录,如passwd、hostname等。 /home:用户的主目录,在Linux中,每个用户都有一个自己的目录,一般该目录名是以用户的账号命名的。 /lib:存放共享的库文件,包含许多被/bin和/sbin中程序使用的库文件。 /lost+found:这个目录一般情况下是空的,当系统非法关机后,这里就存放了一些零散文件。 /media: ubuntu系统自动挂载的光驱、usb设备,存放临时读入的文件。 /mnt:作为被挂载的文件系统得挂载点。 /opt:作为可选文件和程序的存放目录,主要被第三方开发者用来简易安装和卸载他们的软件。 /proc:这个目录是一个虚拟的目录,它是系统内存的映射,我们可以通过直接访问这个目录来获取系统信息。这里存放所有标志为文件的进程,比较cpuinfo存放cpu当前工作状态的数据。 /root:该目录为系统管理员,也称作超级权限者的用户主目录。 /sbin: s就是Super User的意思,这里存放的是系统管理员使用的系统管理程序,如系统管理、目录查询等关键命令文件。 / srv:存放系统所提供的服务数据。 /sys:系统设备和文件层次结构,并向用户程序提供详细的内核数据信息。 /tmp:这个目录是用来存放一些临时文件的,所有用户对此目录都有读写权限。 /usr:存放与系统用户有关的文件和目录。 图2 usr文件夹下的文件 关于usr目录下的文件如下所示: /usr/bin:用户和管理员的标准命令; /usr/games:存放着XteamLinux自带的小游戏; /usr/include:用来存放Linux下开发和编译应用程序所需要的头文件,for c或者c++; /usr/lib:应用程序和程序包的连接库; /usr/local:系统管理员安装的应用程序目录; /usr/locale:系统的文包; /usr/sbin:存放root超级用户使用的管理程序; /usr/share: 用于存放一些共享的数据,比如音乐文件或者图标等等 ; /usr/src: Linux开放的源代码; 如果/usr 是安装时会占用较大硬盘容量的目录,那么/var 就是在系统运行过程中渐渐占用硬盘容量的目录。包括缓存cache,日志log,以及某些软件运行所产生的文件,包括程序文件(lock file, runfile)。 关于var目录下的文件如下所示: 图3 var目录下文件 /var/backups:用户和管理员的标准命令; /var/cache:应用程序缓存目录; /var/lib:存放程序执行过程中,需要使用到的数据文件; /var/local:它是/run/lock目录的软链接,某些设备或文件一次只能被一个应用所使用。这样当这些资源使用时,就要加锁。特别注意:它使用临时文件系统,主机重启后会清空 /var/log:日志文件; /var/mail:电子邮件; /var/opt:系作为可选文件和程序的存放目录,否则将无法引导计算机进入操作系统; /var/spool:存放电子邮件,打印任务等的队列目录。它的子目录/var/spool/mail其实是/var/mail的软链接; /var/tmp:临时文件目录; 最后,再吼一下那句久违的口号: 每天进步一点点,开心多一点^_^ --2017年3月6日 10:22:55
个人分类: linux学习日志|513 次阅读|0 个评论
分享 虚拟机linux下打开相机
wackywy 2017-3-21 11:06
第一:要先在虚拟机可移动设备当中找到相机,若没有则先去将服务中的vmware usb先打开,设为开机启动即可,然后以管理员权限打开,连接相应的相机。 第二:相机连接上可是打开cheese是黑屏;解决方法将虚拟机设置里的usb控制器2.0/3.0互相调换看一下,亲测如此解决。 ps:网上资料都说相机连接后dev下会出现video文件夹,不知道为啥我的是v4l 不知道会不会影响后期的开发。
1028 次阅读|0 个评论
分享 从0教学嵌入式Linux
huchpe 2016-10-12 17:28
【从0教学嵌入式Linux】——by babyking http://bbs.eeworld.com.cn/forum.php?mod=viewthreadtid=491139fromuid=728326 (出处: 电子工程世界-论坛)
个人分类: 初学|2 次阅读|0 个评论
分享 Linux内核源码学习——第1篇
白手梦想家 2016-6-16 11:41
从本篇开始记录Linux源码学习的心得笔记。 一、 刚准备看源码,满心激动,但是进入源码目录却不知从哪看起,很是郁闷,很希望有个教程能指点方向。在学习过程中很多时候不是因为问题本身很难,而是因为难以找到高效的学习方法和方向。但是找了一些视频或者文档,上来就说具体的内容,比如数据结构,很是枯燥,让人看不到目标,看不清路线。而且看教学视频感觉像是被灌输知识,不利于自学能力提高。于是放弃看视频,结合网络资源,自己摸索。经过几天摸索发现,从Main.c文件看起是一个很好的选择。因为它是程序入口点,可以建立对系统执行流程的概念。按照程序执行的流程,执行到哪学到哪,不是很好吗?接下来将持续记录Linux源码学习的过程,Linux版本为2.6.0。 二、
个人分类: Linux源码|279 次阅读|0 个评论
分享 gcc 生成 .a静态库和 .so动态库
DreamStreaking 2016-6-15 15:44
我们通常把一些公用函数制作成函数库,供其它程序使用。函数库分为静态库和动态库两 种。静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库。动态 库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运 行时还需要动态库存在。本文主要通过举例来说明在Linux中如何创建静态库和动态库,以 及使用它们。 在创建函数库前,我们先来准备举例用的源程序,并将函数库的源程序编译成.o文件。 第1步:编辑得到举例的程序--hello.h、hello.c和main.c; hello.c(见程序2)是函数库的源程序,其中包含公用函数hello,该函数将在屏幕上输出" Hello XXX!"。hello.h(见程序1)为该函数库的头文件。main.c(见程序3)为测试库文件的 主程序,在主程序中调用了公用函数hello。 程序1: hello.h #ifndef HELLO_H #define HELLO_H void hello(const char *name); #endif //HELLO_H 程序2: hello.c #include stdio.h void hello(const char *name) { printf("Hello %s!\n", name); } 程序3: main.c #include "hello.h" int main() { hello("everyone"); return 0; } 第2步:将hello.c编译成.o文件; 无论静态库,还是动态库,都是由.o文件创建的。因此,我们必须将源程序hello.c通过g cc先编译成.o文件。 在系统提示符下键入以下命令得到hello.o文件。 # gcc -c hello.c # 我们运行ls命令看看是否生存了hello.o文件。 # ls hello.c hello.h hello.o main.c # 在ls命令结果中,我们看到了hello.o文件,本步操作完成。 下面我们先来看看如何创建静态库,以及使用它。 第3步:由.o文件创建静态库; 静态库文件名的命名规范是以lib为前缀,紧接着跟静态库名,扩展名为.a。例如:我们将 创建的静态库名为myhello,则静态库文件名就是libmyhello.a。在创建和使用静态库时, 需要注意这点。创建静态库用ar命令。 在系统提示符下键入以下命令将创建静态库文件libmyhello.a。 # ar -crv libmyhello.a hello.o # 我们同样运行ls命令查看结果: # ls hello.c hello.h hello.o libmyhello.a main.c # ls命令结果中有libmyhello.a。 第4步:在程序中使用静态库; 静态库制作完了,如何使用它内部的函数呢?只需要在使用到这些公用函数的源程序中包 含这些公用函数的原型声明,然后在用gcc命令生成目标文件时指明静态库名,gcc将会从 静态库中将公用函数连接到目标文件中。注意,gcc会在静态库名前加上前缀lib,然后追 加扩展名.a得到的静态库文件名来查找静态库文件。 在程序3:main.c中,我们包含了静态库的头文件hello.h,然后在主程序main中直接调用公 用函数hello。下面先生成目标程序hello,然后运行hello程序看看结果如何。 法一 # gcc -o hello main.c -L. –lmyhello,自定义的库时,main.c还可放在-L.和 –lmyhello之间,但是不能放在它俩之后,否则会提示myhello没定义,但是是系统的库时,如g++ -o main(-L/usr/lib) -lpthread main.cpp就不出错。 法二 #gcc main.c libmyhello.a -o hello 法三:先生成main.o:gcc -c main.c ,再生成可执行文件:gcc -o hello main.o libmyhello.a,动态库连接时也可以这样做。 # ./hello Hello everyone! # 我们删除静态库文件试试公用函数hello是否真的连接到目标文件 hello中了。 # rm libmyhello.a rm: remove regular file `libmyhello.a'? y # ./hello Hello everyone! # 程序照常运行,静态库中的公用函数已经连接到目标文件中了。 我们继续看看如何在Linux中创建动态库。我们还是从.o文件开始。 第5步:由.o文件创建动态库文件; 动态库文件名命名规范和静态库文件名命名规范类似,也是在动态库名增加前缀lib,但其 文件扩展名为.so。例如:我们将创建的动态库名为myhello,则动态库文件名就是libmyh ello.so。用gcc来创建动态库。 在系统提示符下键入以下命令得到动态库文件libmyhello.so。 # gcc -shared -fPCI -o libmyhello.so hello.o (-o不可少) # 我们照样使用ls命令看看动态库文件是否生成。 # ls hello.c hello.h hello.o libmyhello.so main.c # 第6步:在程序中使用动态库; 在程序中使用动态库和使用静态库完全一样,也是在使用到这些公用函数的源程序中包含 这些公用函数的原型声明,然后在用gcc命令生成目标文件时指明动态库名进行编译。我们 先运行gcc命令生成目标文件,再运行它看看结果。 # gcc -o hello main.c -L. -lmyhello (或 #gcc main.c libmyhello.so -o hello 不会出错(没有libmyhello.so的话,会出错),但是接下来./hello 会提示出错,因为虽然连接时用的是当前目录的动态库,但是运行时,是到/usr/lib中找库文件的,将文件libmyhello.so复制到目录 /usr/lib中就OK了) # ./hello ./hello: error while loading shared libraries: libmyhello.so: cannot open shar ed object file: No such file or directory # 哦!出错了。快看看错误提示,原来是找不到动态库文件libmyhello.so。程序在运行时, 会在/usr/lib和/lib等目录中查找需要的动态库文件。若找到,则载入动态库,否则将提 示类似上述错误而终止程序运行。我们将文件libmyhello.so复制到目录/usr/lib中,再试 试。 # mv libmyhello.so /usr/lib # ./hello Hello everyone! # 成功了。这也进一步说明了动态库在程序运行时是需要的。 我们回过头看看,发现使用静态库和使用动态库编译成目标程序使用的gcc命令完全一样, 那当静态库和动态库同名时,gcc命令会使用哪个库文件呢?抱着对问题必究到底的心情, 来试试看。 先删除除.c和.h外的所有文件,恢复成我们刚刚编辑完举例程序状态。 # rm -f hello hello.o /usr/lib/libmyhello.so # ls hello.c hello.h main.c # 在来创建静态库文件libmyhello.a和动态库文件libmyhello.so。 # gcc -c hello.c # ar -cr libmyhello.a hello.o (或-cvr ) # gcc -shared -fPCI -o libmyhello.so hello.o # ls hello.c hello.h hello.o libmyhello.a libmyhello.so main.c # 通过上述最后一条ls命令,可以发现静态库文件libmyhello.a和动态库文件libmyhello.s o都已经生成,并都在当前目录中。然后,我们运行gcc命令来使用函数库myhello生成目标 文件hello,并运行程序 hello。 # gcc -o hello main.c -L. –lmyhello (动态库和静态库同时存在时,优先使用动态库, 当然,直接#gcc main.c libmyhello.a -o hello的话,就是指定为静态库了) # ./hello ./hello: error while loading shared libraries: libmyhello.so: cannot open shar ed object file: No such file or directory # 从程序hello运行的结果中很容易知道,当静态库和动态库同名时,gcc命令将优先使用动态库,默认去连/usr/lib和/lib等目录中的动态库,将文件libmyhello.so复制到目录/usr/lib中即可。 Note: 编译参数解析 最主要的是GCC命令行的一个选项: -shared 该选项指定生成动态连接库(让连接器生成T类型的导出符号表,有时候也生成弱连接W类型的导出符号),不用该标志外部程序无法连接。相当于一个可执行文件 -fPIC 表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的。 -L. 表示要连接的库在当前目录中;(多个库:在编译命令行中,将使用的静态库文件放在源文件后面就可以了。比如:gcc -L/usr/lib myprop.c libtest.a libX11.a libpthread.a -o myprop 其中-L/usr/lib指定库文件的查找路径。编译器默认在当前目录下先查找指定的库文件,如前面的“法二 #gcc main.c libmyhello.a -o hello”) -lmyhello 编译器查找动态连接库时有隐含的命名规则,即在给出的名字前面加上lib,后面加上.so或.a来确定库的名称libmyhello.so或libmyhello.a。 LD_LIBRARY_PATH 这个环境变量指示动态连接器可以装载动态库的路径。 当然如果有root权限的话,可以修改/etc/ld.so.conf文件,然后调用 /sbin/ldconfig来达到同样的目的,不过如果没有root权限,那么只能采用输出LD_LIBRARY_PATH的方法了。 调用动态库的时候有几个问题会经常碰到,有时,明明已经将库的头文件所在目录 通过 “-I” include进来了,库所在文件通过 “-L”参数引导,并指定了“-l”的库名,但通过ldd命令察看时,就是死活找不到你指定链接的so文件,这时你要作的就是通过修改 LD_LIBRARY_PATH或者/etc/ld.so.conf文件来指定动态库的目录。通常这样做就可以解决库无法链接的问题了。 另: 从上述可知,如何找到生成的动态库有3种方式: (1)把库拷贝到/usr/lib和/lib目录下。 (2)在LD_LIBRARY_PATH环境变量中加上库所在路径。 例如动态库libhello.so在/home/example/lib目录下: $export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/example/lib (3) 修改/etc/ld.so.conf文件,把库所在的路径加到文件末尾,并执行ldconfig刷新。这样,加入的目录下的所有库文件都可见。 附:像下面这样指定路径去连接系统的静态库,会报错说要连接的库找不到: g++ -o main main.cpp -L/usr/lib libpthread.a 必须这样g++ -o main main.cpp -L/usr/lib -lpthread才正确 。 自定义的库考到/usr/lib 下时, g++ -o main main.cpp -L/usr/lib libpthread.a libthread.a libclass.a 会出错,但是这样 g++ -o main main.cpp -L/usr/lib -lpthread -lthread -lclass 就正确了。 ***************************************** 在GCC下实现自己的静态库 静态库的有关知识,请自行了解,这里只是讲一点简单的实现过程。 1、$mkdir static_lib_demo 2、用vim新产生文件main.c welcome.c //---------------main.c------------------ #include stdio.h int main() { printf("Hello,world!\n"); disp(); return 0; } //-------------welcome.c------------------ #include stdio.h void disp() { printf("welcome to NEWSMTH!\n"); } 3、编译产生obj文件 $gcc -c main.c welcome.c 4、产生.a库文件 $ar -r libwelcome.a welcome.o 5、用生成的库文件进行链接 $gcc main.o -o main -L/home/zgj/static_lib_demo -lwelcome 其中:/home/zgj/static_lib_demo是libwelcome.a所在的目录 6、./main Hello,world! welcome to NEWSMTH! 完成演示 其它: 1、察看.a里有哪些obj文件 $ar -t libwelcome.a welcome.o $ ar -vt libwelcome.a rw-rw-r-- 507/507 792 Oct 14 08:01 2005 welcome.o 2、.a库文件包含多个obj文件 $ar -r libwelcome.a welcome.o welcome2.o 如果libwelcome.a存在,则libwelcome.a被更新。 如果已存在的libwelcome.a内已经包含welcome.o,则libwelcome.a内welcome.o被更新。 如果已存在的libwelcome.a内没有包含welcome.o,则添加welcome.o到libwelcome.a内,libwelcome.a内原其他obj文件不变。 从libwelcome.a内删除welcome.o $ ar -d libwelcome.a welcome.o 3、如果libwelcome.a在当前目录,还可以直接用libwelcome.a进行链接 $gcc -o main main.o libwelcome.a 4、其它参数详细内容请看gcc(1)、ar(1)
个人分类: LINUX|1226 次阅读|0 个评论
分享 Linux学习之——C语言进阶
白手梦想家 2016-4-12 10:22
前言 本文将持续更新再Linux学习过程中学到的C语言的新知识。 正文 一个新的结构体初始化的写法(c99标准): 标准C标记式结构(体)初始化语法 。这个写法类似于JSON格式,好处很多,谭浩强书中的那个是旧标准(大学课本更新速度太慢,甚至当时使用Turboc C编程,诶)。
个人分类: ARM-Linux|425 次阅读|0 个评论
分享 Linux学习之——Makefile编写笔记
白手梦想家 2016-4-8 14:30
   本文将持续更新关于Makefile的知识点整理内容。 :=和=的区别 =是在声明处展开,:=在使用的时候才展开。
个人分类: ARM-Linux|264 次阅读|0 个评论
分享 ARM-Linux学习启动篇
白手梦想家 2016-3-17 20:13
ARM-Linux学习启动篇
前几天在网上买的周立功 EasyARM-i.MX280A的板子,今天到货了,准备全面开始学习ARM和Linux。 这块板子很便宜,79+15元。但是刚买后,就收到短信说3.15降价了,49+15元,看来网购本领太差了,不会算日子。 核心的参数: 实物图: 但是我还没用,也不会用,不知道和stm32是不是差不多? 准备好踏上学习之路啦!
个人分类: ARM-Linux|965 次阅读|0 个评论

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2020-9-26 14:26 , Processed in 0.067613 second(s), 22 queries , Gzip On, MemCache On.

Powered by EEWORLD电子工程世界

© 2020 http://bbs.eeworld.com.cn/

返回顶部