LINUXCNC源程序原理说明

合集下载

一个C程序的编译过程(Linux环境下Gcc)

一个C程序的编译过程(Linux环境下Gcc)

一个C程序的编译过程(Linux环境下Gcc)一以下是C程序一般的编译过程:从图中看到:将编写的一个c程序(源代码)转换成可以在硬件上运行的程序(可执行代码),需要进行编译阶段和链接这两个阶段。

其中,1. 编译阶段先通过“编译器“把一个 .c / .cpp 源代码编译成 .s的汇编代码;再经过“汇编器” 把这个.s的汇编代码汇编成.o 的目标代码2. “连接器“ 通过连接其他 .o 代码(如果需要的话)库文件和1 中的.o 目标代码生成可执行文件该文件流被这三种程序(红色)的加工,分别表现出四种形式(蓝色),这就是c程序的编译和链接过程。

如果再详细的话,编译器在将源文件编译成汇编文件的过程又分为:预处理阶段(生成.i代码)和优化阶段二、C编程中的文件后缀名介绍.c 未经过预处理的C源码.h C头文件.i 经过预处理的C源码.s 生成的汇编语言代码.o 编译之后产生的目标文件解释:*.c一般使我们自己编辑的代码,使我们劳动的结晶;*.h一般是我们手工生成的接口文件,如果愿意,也可在*.c完成后用GCC的选项-aux-info帮我们生成;*.i是经过预处理后的源码,是由GCC在选项-E编译下自动生成的文件;*.o是编译后产生的目标文件;*.s是GCC 在选项-S编译下生成的汇编语言代码,对于性能要求很高的程序可以先生成汇编语言文件并对汇编做优化,然后用优化后的汇编生成目标文件并链接三演示hello.c的编译过程(Linux 下Gcc)本小节的演示都针对文件hello.c 进行1. /*2. * hello.c3. */4.5. #include <stdio.h>6. int main()7. {8. printf(" Better goal, Better life! /n");9. return 0;10. }1.生成预处理后的文件hello.i$ gcc -E hello.c -o hello.i2.生成汇编语言文件hello.s$ gcc -s hello.i -o hello.s3.生成目标文件hello.o$ gcc -c hello.i$ gcc -c hello.s4. 生成可执行文件$ gcc -o hello hello.o5. 运行及结果$./helloBetter goal, Better life!当然也可以直接生成,$ gcc -c hello.c 就可以生成可执行文件。

LinuxGCC如何实现代码编译汇编链接过程

LinuxGCC如何实现代码编译汇编链接过程

LinuxGCC如何实现代码编译汇编链接过程正⽂:每次我们程序员所写的代码是给程序员看的呢?还是给电脑看的?其实我们所写的代码只是我们程序员之间交流的⼀样特殊语⾔,电脑是看不懂的。

那么我们如何实现⼈机交流呢?这就不得不请出我们我们今天的主⾓⼈机交换的桥梁---编译器,编译器有很多,我们今天介绍的是⼀种基于 Linux 系统的 GCC 编译器,以下代码都是在 Linux 系统上 VI 编辑器代码 GCC 编译代码实现的。

1、GCC概述通常我们所写的代码⽆论 C \ C++ 等⼀些⾼级语⾔其实电脑是识别不了的。

代码只是我们程序员⼈与⼈之间交流的⼀种特殊语⾔,GCC 起初的全名是 GUN C Comlier 通俗的来说 GCC 编译器就好⽐是翻译官,把我们程序员写的代码翻译成电脑识别的机器语⾔。

随着 GCC 编译器的功能不断强⼤,⽀持的语⾔越来越多,他的名称就变成了 GUN Comlier Collection 也称编译组织,⾥⾯包含了许多的“ ⼯作成员 ”,接下来我们就来看看 GCC 编译器⾥的成员(编译、汇编、链接)是怎么分⼯合作实现⼈机交互编译的。

2、编译什么是编译?我们通过在Linux终端创建⼀个点C ⽂件,输⼊「gcc -v -o test1 test_1.c」打开⽂件我们可以看到⼀堆的英⽂,先别慌,不要觉得看不懂,我们只看有⽤的重点,看到⽩⾊背景的⽅框我们可以看见,所谓编译就是「/usr/lib/gcc/x86_64-linux-gnu/4.8/cc1 -o xxx.s test_1.c」⾥ cc1 把我们的 .C 输⼊⽂件编译成 xxx.S 的输出⽂件是不是我们每次编译都要输⼊这么⼀⼤段的⽂字呢?不⽤,我们只要⽤简洁的办法「gcc -S」( S是⼤写的 )这个命令等价于上⾯的那⼀段字母命令来输出就可以。

这样就得到⼀个 xxx.s 的输出⽂件,代码如下图:这个还是我们程序员之间交流的另⼀种语⾔(汇编语⾔),但是这样的⽂件计算机还是不认识,所以我们还的继续下⼀步。

开源机器人控制平台LinuxCNC介绍与应用

开源机器人控制平台LinuxCNC介绍与应用

开源机器人控制平台LinuxCNC介绍软件平台采用最初由美国标准与技术研究院研制的一套用于机器人与通用数控机床等运动控制的开放式数控系统。

原名为EMC2,后来改为LinuxCNC,该系统是一个源代码公开的自由免费软件,该系统最大支持9轴联动控制,内置具有前瞻性的实时轨迹规划器,通过定制运动学模块可支持非笛卡尔空间的运动控制,支持的结构包括机器人关节控制和六轴连杆昆虫机器人控制等。

具有较高的科研价值和实际应用价值。

具备以下特点:1)LinuxCNC支持最多9轴运动控制,内置具有前瞻性的实时轨迹规划器,可实现轨迹误差限制、轴同步运动控制、自适应进给率控制等功能;2)提供一个适用于RS-274机床编程语言的G代码解析器,使得机床编程通俗易用,降低了推广应用难度;3)提供了用于模块化自由配置的HAL层,实现控制系统自由定制与功能灵活扩展;4)通过定制运动学模块可支持非笛卡尔空间的运动控制。

5)支持多种人机交互图形界面。

包括Tcl/Tk、Python实现的Tkinter等。

LinuxCNC是一款构建于实时Linux操作系统之上的纯软件数控系统,具有设计便捷、灵活、易扩展等优点。

用户针对特定的数控系统应用要求,定制相应的配置文件、HAL模块连接以及操作界面即可完成机床控制系统的开发。

鉴于多年使用linuxcnc系统经验,觉得linuxcnc系统具有很大的发展前景,不单单得益于上述系统自身的优点,关键在于它在不断的向前发展,且发展越来越好。

linuxcnc目前多用在标准机床控制上,如铣床,雕刻机,具有很显著的性价比。

以后还可能大量用在机器人方面,是它发展的一个趋势。

新的LinuxCNC2.6版本支持NURBS功能和前瞻控制:14.7 G5.1 Quadratic B-splineG5.1 X- Y- I- J-• I - X axis offset• J - Y axis offsetG5.1 creates a quadratic B-spline in the XY plane with the X and Y axis only. The offsets are I for X axis and J for Y axis.It is an error if:• I and J offset is not specified• An axis other than X or Y is specified• The active plane is not G1714.8 G5.2 G5.3 NURBs BlockG5.2 X- Y- P- <L->X- Y- P- <L->...G5.3Warning: G5.2, G5.3 is experimental and not fully tested.G5.2 is for opening the data block defining a NURBs and G5.3 for closing the data block. In the lines between these two codesthe curve control points are defined with both their related weights (P) and their parameter (L) which determines the order of thecurve (k) and subsequently its degree (k-1).Using this curve definition the knots of the NURBs curve are not defined by the user they are calculated by the inside algorithm,in the same way as it happens in a great number of graphic applications, where the curve shape can be modified only acting oneither control points or weights.LinxuCNC配套的控制卡很难找,目前只有淘宝一家LinuxCNC商家在卖LinuxCNC专用的高速控制卡MotCAT。

linuxc编程基础内容

linuxc编程基础内容

linuxc编程基础内容Linux是一种开源的操作系统,广泛应用于各种计算机设备和嵌入式系统中。

在Linux系统中,C语言是一种常用的编程语言,被广泛用于开发各种应用程序和系统组件。

本文将介绍Linux C编程的基础内容,包括编译和运行C程序、变量和数据类型、控制流、函数和文件操作等方面的知识。

一、编译和运行C程序在Linux系统中,使用gcc编译器来编译C程序。

首先,我们需要创建一个以.c为扩展名的源代码文件,比如hello.c。

在文件中编写C程序代码,然后使用以下命令进行编译:gcc hello.c -o hello其中,hello.c是源代码文件的名字,-o hello表示将编译生成的可执行文件命名为hello。

编译成功后,可以使用以下命令来运行程序:./hello二、变量和数据类型在C语言中,我们可以定义各种类型的变量来存储不同种类的数据。

常见的数据类型包括整型、浮点型、字符型和指针类型等。

在Linux C编程中,我们可以使用int来表示整型变量,float或double来表示浮点型变量,char来表示字符型变量,以及void*来表示指针类型变量。

三、控制流控制流是指程序在执行过程中根据条件选择不同的执行路径。

在C 语言中,我们可以使用if语句、switch语句、for循环、while循环和do-while循环等结构来实现控制流。

这些结构可以帮助我们实现条件判断、循环执行和跳转等功能,从而实现复杂的程序逻辑。

四、函数函数是C语言中的重要概念,它可以将一段代码封装成一个可以重复使用的模块。

在Linux C编程中,我们可以通过函数来实现程序的模块化和结构化。

函数可以接受参数并返回一个值,也可以不接受参数或不返回值。

使用函数可以提高程序的可读性和可维护性。

五、文件操作在Linux系统中,文件操作是一种常见的需求。

C语言提供了一组用于文件操作的函数,包括打开文件、读取文件、写入文件和关闭文件等操作。

LINUXCNC源程序原理说明

LINUXCNC源程序原理说明

opLINUXCNC源程序学习源程序的树结构如下:Overview of the emc2 directory (generated by tree -I .git -d) :.|-- app-defaults|-- bin (user mode binaries)|-- configs| |-- 5axis| |-- boss| |-- common| |-- dallur-thc| |-- demo_mazak (sample mazak config files)| |-- demo_sim_cl (sample sim with ladder IO)| |-- demo_step_cl (sample stepper with ladder IO)| |-- etch-servo| |-- halui_halvcp| |-- hexapod-sim| |-- lathe-pluto| |-- m5i20 (sample servo using Mesa PCI)| |-- max| |-- motenc (sample servo using Vital PCI)| |-- nist-lathe| |-- plasma-thc| |-- plasma-thc-sim| |-- ppmc| |-- puma| |-- scara| |-- sim (simulated motion and IO)| |-- stepper (parport stepper driver)| |-- stepper-gantry| |-- stepper-xyza| |-- stg (sample servo using STG ISA)| |-- univpwm (sample PICO servo generator)| |-- univstep (sample PICO stepper generator)| `-- vti|-- debian (files needed to build deb packages)| |-- (extra files for Ubuntu| | |-- etc| | | |--| | | |-- udev| | | | |--| | | | `-- scripts| | | `-- xdg| | | `-- menus| | | `-- applications-merged| | `-- usr| | |-- applications| | |-- desktop-directories| | `-- pixmaps| |-- (extra files for building on Ubuntu Dapper Drake) | | |-- etc| | | |--| | | |-- udev| | | | |--| | | | `-- scripts| | | `-- xdg| | | `-- menus| | | `-- applications-merged| | `-- usr| | `-- share| | |-- applications| | |-- desktop-directories| | `-- pixmaps| |-- (extra files for building on Ubuntu| | |-- etc| | | |--| | | |-- udev| | | | `--| | | `-- xdg| | | `-- menus| | | `-- applications-merged| | `-- usr| | `-- share| | |-- applications| | |-- desktop-directories| | `-- pixmaps| |-- (extra files for building on Ubuntu Hardy Heron) | | |-- etc| | | |--| | | `-- xdg| | | `-- menus| | | `-- applications-merged| | `-- usr| | `-- share| | |-- applications| | |-- desktop-directories| | `-- pixmaps| |-- (extra files for sim package for Ubuntu| | |-- etc| | | `-- xdg| | | `-- menus| | | `-- applications-merged| | `-- usr| | `-- share| | |-- desktop-directories| | `-- pixmaps| `-- (extra files for sim package for Ubuntu Dapper Drake)| |-- etc| | `-- xdg| | `-- menus| | `-- applications-merged| `-- usr| `-- share| |-- applications| |-- desktop-directories| `-- pixmaps|-- docs (All the important and relevant Docs.)| |-- help| |-- html (html version of docs - some generated from lyx)| |-- man (man pages)| | |-- man1| | |-- man3| | `-- man9| `-- src (API and source notes should be in each src dir.) (source for the handbooks) (top level .lyx files)| |-- code| |-- common (shared .lyx files and images, such as glossary, GPLD license)| |-- config| |-- gcode (.lyx files, images, etc. for G-Code documentation)| |-- gui (.lyx files, images, etc. for GUI documentation)| |-- hal (.lyx files, images, etc. for HAL documentation)| |-- install| |-- ladder| |-- motion| `-- quickstart|-- include (headers installed here - originals in src/xxx/)|-- lib (user mode object files)| `-- python| |-- rs274| `-- yapps|-- nc_files (Sample NC files)|-- rtlib (kernel mode object files, only after a successfull compile)|-- scripts(bash scripts like linuxcnc, realtime, rip-environment, etc.)|-- share| |-- axis| | |-- images| | `-- tcl| |-- emc| `-- locale| |-- de| | `-- LC_MESSAGES| |-- es| |-- fr| | `-- LC_MESSAGES| |-- hu| | `-- LC_MESSAGES| |-- it| | `-- LC_MESSAGES| |-- pt_BR| | `-- LC_MESSAGES| |-- ro| | `-- LC_MESSAGES| |-- ru| | `-- LC_MESSAGES| |-- se| | `-- LC_MESSAGES| |-- sr| | `-- LC_MESSAGES| `-- zh_CN| `-- LC_MESSAGES|-- src (source tree - configure script, top level makefile, , etc)| || |-- depends (generated dependency tree)| || |-- emc (actual LinuxCNC code)| | |-- canterp (interpreter for canonical commands)| | |-- ini (inifile related operations)| | |-- iotask (IO interface, lots of HAL pins)| | |-- kinematics (trajectory planner and kinematics)| | |-- motion (motion controller, talks through SHM to the rest of EMC)| | |-- nml_intf (emc specific NML implementation, all messages sent in emc)| | |-- rs274ngc (the rs274 g-code interpreter)| | |-- sai| | |-- task (core component in emc, dispatches actions to other parts)| | `-- usr_intf (interfaces for some GUIs, and other interfaces: AXIS, halui, stepconf) | | |-- axis| | | |-- etc| | | |-- extensions| | | `-- scripts| | `-- stepconf| |-- hal (the Hardware Abstraction Layer, provides a unified interface across all hardware)| | |-- classicladder| | | `-- projects_examples| | |-- components| | |-- drivers| | | |-- m5i20| | | | |-- bit| | | | `-- hostmot5_src| | | |-- mesa-hostmot2| | | | | `-- SOURCE| | | | `-- 7i43| | | | |-- CPLD| | | | | `-- SOURCE| | | | `-- SOURCE| | | |-- mesa7i43-firmware| | | | |-- gpio| | | | | `-- source| | | | |-- hostmot2| | | | | `-- src| | | | `-- source| | | |-- mesa_5i2x| | | | `-- firmware| | | |-- pluto_servo_firmware| | | `-- pluto_step_firmware| | |-- user_comps| | | |-- devices| | | `-- vcp| | `-- utils| | `-- halgui| |-- libnml (a clean implementation of RCSLIB) | | |-- buffer| | |-- cms| | |-- inifile| | |-- linklist| | |-- nml| | |-- os_intf| | |-- posemath| | `-- rcs| |-- module_helper| |-- objects| | |-- emc| | | |-- canterp| | | |-- ini| | | |-- iotask| | | |-- motion| | | |-- nml_intf| | | |-- rs274ngc| | | |-- sai| | | |-- task| | | `-- usr_intf| | | `-- axis| | | `-- extensions| | |-- hal| | | |-- classicladder| | | |-- components| | | | `-- vcp| | | `-- utils| | |-- libnml| | | |-- buffer| | | |-- cms| | | |-- inifile| | | |-- linklist| | | |-- nml| | | |-- os_intf| | | |-- posemath| | | `-- rcs| | |-- rtapi| | |-- rtemc| | | |-- kinematics| | | `-- motion| | |-- rthal| | | |-- classicladder| | | |-- components| | | `-- utils| | |-- rtlibnml| | | `-- posemath| | `-- rtobjects| | `-- hal| | `-- components| |-- po (Translation files for i18n support)| |-- rtapi (*.c and *.h for RTAPI) (unified RT API, wraps over RTLinux, RTAI and sim) | | `-- examples (testing examples for the RTAPI)| | |-- extint| | |-- fifo| | |-- semaphore| | |-- shmem| | `-- timer| `-- tests|-- tcl , - the tcl GUI's)| |-- bin| `-- scripts`-- tests|--|--|-- basic|-- ccomp| |-- lathe-comp| |-- mill-g90g91g92| |-- mill-line-arc-entry| `-- mill-zchanges|--|-- interp| |-- cam-nisley| `-- flowsnake|--|--|--|--|-- overrun|-- oword| `--|--|--|--|--|--|--|--`--Overview of the emc2 install dirs:/ (file system root)|||--- etc/| || \---| || \--- realtime (realtime start/stop script)|||--- $(prefix) (default: /usr/local)| | (all the following $xxxxdir are configurable through autoconf | || |--- bin/ (known as $bindir, files from EMC2/bin)| || |--- sbin/ (known as $sbindir, )| || |--- etc/ (known as $sysconfdir, config files and subdirs from configs/) | || |--- lib/ (known as $libdir, lib files *.so from libs/)| || \--- share/| || \--- emc/| || || | || | \--- (All the important and relevant Docs.)| || |--- handbooks/| | || | \--- (PDF versions of handbooks)| || \--- nc_files/| || \--- (Sample NC files)||--- $MAN_DIR/ (default: /usr/local/man)| || |--- man1/| | || || || \--- man3/| |||\--- $moduledir/ (based on where ./configure finds the RTOS modules)根据这个结构树,我们可以清楚的知道每一个文件夹,每一个子文件的作用,包括了接口,硬件抽象层,实时内核等等部分。

Linux下的C语言编程-基础知识

Linux下的C语言编程-基础知识

Linux下的C语言编程--基础知识篇前言:这篇文章介绍在LINUX下进行C语言编程所需要的基础知识.在这篇文章当中,我们将会学到以下内容:源程序编译Makefile的编写程序库的链接程序的调试头文件和系统求助--------------------------------------------------------------------------------1.源程序的编译在Linux下面,如果要编译一个C语言源程序,我们要使用GNU的gcc编译器. 下面我们以一个实例来说明如何使用gcc编译器.假设我们有下面一个非常简单的源程序(hello.c):int main(int argc,char **argv){printf("Hello Linux\n");}要编译这个程序,我们只要在命令行下执行:gcc -o hello hello.cgcc 编译器就会为我们生成一个hello的可执行文件.执行./hello就可以看到程序的输出结果了.命令行中 gcc表示我们是用gcc来编译我们的源程序,-o 选项表示我们要求编译器给我们输出的可执行文件名为hello 而hello.c是我们的源程序文件.gcc编译器有许多选项,一般来说我们只要知道其中的几个就够了. -o选项我们已经知道了,表示我们要求输出的可执行文件名. -c选项表示我们只要求编译器输出目标代码,而不必要输出可执行文件. -g选项表示我们要求编译器在编译的时候提供我们以后对程序进行调试的信息.知道了这三个选项,我们就可以编译我们自己所写的简单的源程序了,如果你想要知道更多的选项,可以查看gcc的帮助文档,那里有着许多对其它选项的详细说明.2.Makefile的编写假设我们有下面这样的一个程序,源代码如下:/* main.c */#include "mytool1.h"#include "mytool2.h"int main(int argc,char **argv){mytool1_print("hello");mytool2_print("hello");}/* mytool1.h */#ifndef _MYTOOL_1_H#define _MYTOOL_1_Hvoid mytool1_print(char *print_str);#endif/* mytool1.c */#include "mytool1.h"void mytool1_print(char *print_str){printf("This is mytool1 print %s\n",print_str);}/* mytool2.h */#ifndef _MYTOOL_2_H#define _MYTOOL_2_Hvoid mytool2_print(char *print_str);#endif/* mytool2.c */#include "mytool2.h"void mytool2_print(char *print_str){printf("This is mytool2 print %s\n",print_str);}当然由于这个程序是很短的我们可以这样来编译gcc -c main.cgcc -c mytool1.cgcc -c mytool2.cgcc -o main main.o mytool1.o mytool2.o这样的话我们也可以产生main程序,而且也不时很麻烦.但是如果我们考虑一下如果有一天我们修改了其中的一个文件(比如说mytool1.c)那么我们难道还要重新输入上面的命令?也许你会说,这个很容易解决啊,我写一个SHELL脚本,让她帮我去完成不就可以了.是的对于这个程序来说,是可以起到作用的.但是当我们把事情想的更复杂一点,如果我们的程序有几百个源程序的时候,难道也要编译器重新一个一个的去编译?为此,聪明的程序员们想出了一个很好的工具来做这件事情,这就是make.我们只要执行以下make,就可以把上面的问题解决掉.在我们执行make之前,我们要先编写一个非常重要的文件.--Makefile.对于上面的那个程序来说,可能的一个Makefile的文件是:# 这是上面那个程序的Makefile文件main:main.o mytool1.o mytool2.ogcc -o main main.o mytool1.o mytool2.omain.o:main.c mytool1.h mytool2.hgcc -c main.cmytool1.o:mytool1.c mytool1.hgcc -c mytool1.cmytool2.o:mytool2.c mytool2.hgcc -c mytool2.c有了这个Makefile文件,不过我们什么时候修改了源程序当中的什么文件,我们只要执行make命令,我们的编译器都只会去编译和我们修改的文件有关的文件,其它的文件她连理都不想去理的.下面我们学习Makefile是如何编写的.在Makefile中也#开始的行都是注释行.Makefile中最重要的是描述文件的依赖关系的说明.一般的格式是:target: componentsTAB rule第一行表示的是依赖关系.第二行是规则.比如说我们上面的那个Makefile文件的第二行main:main.o mytool1.o mytool2.o表示我们的目标(target)main的依赖对象(components)是main.o mytool1.o mytool2.o 当倚赖的对象在目标修改后修改的话,就要去执行规则一行所指定的命令.就象我们的上面那个Makefile第三行所说的一样要执行 gcc -o main main.o mytool1.o mytool2.o 注意规则一行中的TAB表示那里是一个TAB键Makefile有三个非常有用的变量.分别是$@,$^,$<代表的意义分别是:$@--目标文件,$^--所有的依赖文件,$<--第一个依赖文件.如果我们使用上面三个变量,那么我们可以简化我们的Makefile文件为:# 这是简化后的Makefilemain:main.o mytool1.o mytool2.ogcc -o $@ $^main.o:main.c mytool1.h mytool2.hgcc -c $<mytool1.o:mytool1.c mytool1.hgcc -c $<mytool2.o:mytool2.c mytool2.hgcc -c $<经过简化后我们的Makefile是简单了一点,不过人们有时候还想简单一点.这里我们学习一个Makefile的缺省规则.c.o:gcc -c $<这个规则表示所有的 .o文件都是依赖与相应的.c文件的.例如mytool.o依赖于mytool.c这样Makefile还可以变为:# 这是再一次简化后的Makefilemain:main.o mytool1.o mytool2.ogcc -o $@ $^.c.o:gcc -c $<好了,我们的Makefile 也差不多了,如果想知道更多的关于Makefile规则可以查看相应的文档.3.程序库的链接试着编译下面这个程序/* temp.c */#includeint main(int argc,char **argv){double value;printf("Value:%f\n",value);}这个程序相当简单,但是当我们用 gcc -o temp temp.c 编译时会出现下面所示的错误./tmp/cc33Kydu.o: In function `main':/tmp/cc33Kydu.o(.text+0xe): undefined reference to `log'collect2: ld returned 1 exit status出现这个错误是因为编译器找不到log的具体实现.虽然我们包括了正确的头文件,但是我们在编译的时候还是要连接确定的库.在Linux下,为了使用数学函数,我们必须和数学库连接,为此我们要加入 -lm 选项. gcc -o temp temp.c -lm这样才能够正确的编译.也许有人要问,前面我们用printf函数的时候怎么没有连接库呢?是这样的,对于一些常用的函数的实现,gcc 编译器会自动去连接一些常用库,这样我们就没有必要自己去指定了. 有时候我们在编译程序的时候还要指定库的路径,这个时候我们要用到编译器的 -L选项指定路径.比如说我们有一个库在 /home/hoyt/mylib下,这样我们编译的时候还要加上 -L/home/hoyt/mylib.对于一些标准库来说,我们没有必要指出路径.只要它们在起缺省库的路径下就可以了.系统的缺省库的路径/lib /usr/lib /usr/local/lib 在这三个路径下面的库,我们可以不指定路径.还有一个问题,有时候我们使用了某个函数,但是我们不知道库的名字,这个时候怎么办呢?很抱歉,对于这个问题我也不知道答案,我只有一个傻办法.首先,我到标准库路径下面去找看看有没有和我用的函数相关的库,我就这样找到了线程(thread)函数的库文件(libpthread.a). 当然,如果找不到,只有一个笨方法.比如我要找sin这个函数所在的库. 就只好用 nm -o/lib/*.so|grep sin>~/sin 命令,然后看~/sin文件,到那里面去找了. 在sin文件当中,我会找到这样的一行libm-2.1.2.so:00009fa0 W sin 这样我就知道了sin在 libm-2.1.2.so库里面,我用 -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编程

Linux下C编程

Linux下C编程第⼆章Linux 系统下C语⾔程序设计⽬前L inux 已经被⼴泛的使⽤,因此有必要简单介绍⼀下,在L inux 系统下如何进⾏C 语⾔程序设计。

⾸先介绍在Linux 下如何编辑C 语⾔源程序,接下来介绍如何编译C 语⾔源程序,最好介绍如何调试与运⾏C语⾔源程序。

由于不是所有⽤户的L inux 系统中都安装了G CC 系统,因此有必要先介绍⼀下G CC 的安装。

2.1 GCC 的安装Linux 与U nix 类似,完全由C语⾔编写⽽成,因此天⽣的⽀持C语⾔。

在⽬前主流的Linux 发⾏版本中都包含了G NU 的C语⾔编译器(简称G NU C,或称为G CC)。

如果当前的L inux 系统中没有安装G CC,可以访问下⾯的站点搜索所需的安装⽂件:/doc/df843113a2161479171128be.html /或直接访问ftp:///doc/df843113a2161479171128be.html /gcc 然后进⾏安装即可。

在安装之前,需要下载G CC 编译器、所需的库⽂件和联机帮助⽂件,这些⽂件⼀般以压缩⽂件格式(.tar 或.zip)提供,需要解压缩后使⽤。

⽬前GCC 的版本为3.2.2,下载其相关的⽂件即可。

根据具体的情况,安装G CC 有如下三种⽅法:1) 升级现有L inux 系统:适⽤于具有L inux 安装光盘,但是当前的系统没有安装G CC系统。

2) 通过R PM 安装:适⽤于具有L inux 安装光盘,并且包含相关的安装⽂件。

3) 从I nternet 下载:适⽤于没有L inux 安装光盘,但是可以接⼊互联⽹(WWW)。

第⼀种⽅法基本上是升级当前的L inux 系统,因此需要如下的步骤:1) 备份当前系统的重要⽂件;2) 插⼊L inux 安装光盘。

执⾏系统安装。

⽐较简单的⽅式是从光盘引导系统;3) 选择常规模式,并进⼊安装过程;4) 选择升级模式;5) 选择相关的升级包,主要包括Develpoment/Debuggers、Develpoment/Languages、Develpoment\Libraries、Develpoment\Tools;6) 等待安装结束即可。

linux c 编程介绍

linux c 编程介绍

Linux c 编程介绍一:编译及调试1.1编译Linux 是一种类UNIX系统,C编译器是传统的UNIX中的标准组件,尤其是在开源的类UNIX中。

Linux分发版中包含了GNU C(gcc)和GNU C++(g++)两个编译器,分别用于C和C++原程序的编译。

gcc格式:gcc –cv [-o filename][-pg]filenamegcc用于编译一个或多个文件中的C代码,并生成目标模块或可执行文件。

C原代码文件应以”.c”为扩展名。

-c用于生成目标模块,等待以后连接。

-o指明生成可执行文件的文件名。

-pg用于生成分析数据。

(hello.c)int main(int argc,char **argv){printf(“Hello Linux\n”);}只需要用gcc -o hello hello.c(-o表示要生成的文件名,默认从a1开始)如果要引用一些库则需要如下命令:LIB = -L/usr/local/libINCLUDE = -I/usr/local/include/LIBS = -lxml2 -lrtp –lexosip2这个-L 和-I 开关告诉编译器和链接分别在哪里找到library 和include 文件。

在这个例子里,xml2、rtp、exosip2 库应该在/usr/local/lib 目录,且它们包含的头文件应该在/usr/local/include/目录里。

1.2 链接在编译时候经常会出现collect2: ld returned 1 exit status这样的连接错误,在编译时候找不到相应函数的具体实现,虽然我们包括了正确的头文件,但是我们在编译的时候还是要连接确定的库。

比如调用xml2库中相关函数需要-lxml2来指定引用xml2库,引用数学函数需要-lm来指定引用了math库。

对于一些常用的函数的实现,gcc编译器会自动去连接一些常用库,这样我们就没有必要自己去指定了。

linux cp命令原理

linux cp命令原理

linux cp命令原理Linux cp命令原理解析一、引言在Linux操作系统中,我们经常需要对文件进行复制和移动操作。

而其中一个常用的命令就是cp命令,它可以实现文件的复制功能。

本文将从cp命令的原理入手,详细解析cp命令的工作原理及其实现过程。

二、cp命令简介cp命令是Linux操作系统中用来复制文件或目录的命令,其语法格式如下:cp [选项] 源文件目标文件三、cp命令的工作原理1. 判断源文件是否存在执行cp命令时,首先会判断源文件是否存在。

如果不存在,则会输出错误提示信息并终止执行;如果存在,则继续执行下一步。

2. 判断目标文件是否存在如果目标文件已存在,则会提示是否覆盖。

根据用户的选择,如果选择覆盖,则继续执行;如果选择不覆盖,则终止执行。

3. 创建目标文件如果目标文件不存在或允许覆盖,则会创建一个新的目标文件。

4. 复制文件内容将源文件的内容复制到目标文件中。

在复制过程中,cp命令会逐个读取源文件中的字符,并将其逐个写入目标文件中。

5. 设置目标文件权限复制完成后,cp命令会将目标文件的权限设置为与源文件相同。

这样可以确保目标文件与源文件在权限上保持一致。

6. 复制文件属性除了文件内容和权限外,cp命令还会复制源文件的其他属性,例如文件的所有者、所属组、创建时间等。

7. 完成复制操作当所有的复制操作都完成之后,cp命令会输出复制成功的提示信息,并结束执行。

四、cp命令实现的关键步骤1. 打开源文件和目标文件在进行文件复制之前,首先需要打开源文件和目标文件。

通过文件描述符来实现对文件的访问和操作。

2. 读取源文件的内容通过源文件的文件描述符,逐个读取源文件中的字符。

可以使用read()系统调用来实现这一步骤。

3. 写入目标文件通过目标文件的文件描述符,逐个写入读取到的字符。

可以使用write()系统调用来实现这一步骤。

4. 设置目标文件的权限通过chmod()系统调用,将目标文件的权限设置为与源文件相同。

linux中源码管理的原理和工作机制

linux中源码管理的原理和工作机制

linux中源码管理的原理和工作机制Linux中的源码管理是指对Linux操作系统的源代码进行版本控制和管理的过程。

源码管理的原理和工作机制对于开发者来说非常重要,它可以帮助开发团队更好地合作,追踪代码的变化,及时修复bug,提高代码质量和开发效率。

本文将详细介绍Linux源码管理的原理和工作机制。

一、源码管理的概念源码管理(Source Code Management,简称SCM)是一种用于跟踪和控制源代码的更改的技术。

它允许多个开发者同时对同一个代码库进行修改,并能够记录每一次修改的细节。

通过源码管理系统,开发者可以轻松地查看代码的历史版本、分支和合并等操作,确保团队成员之间的协作无缝衔接。

二、常见的源码管理工具在Linux中,常见的源码管理工具有Git、SVN等。

这些工具都提供了命令行和图形化界面来帮助开发者进行源码管理操作。

1. GitGit是目前最流行的分布式版本控制系统,被广泛应用于开源项目和企业软件开发中。

它以快速、高效和强大的分支和合并功能而闻名。

开发者可以使用Git来追踪代码的修改历史、创建新的分支、合并分支、提交修改等操作。

SVN是一种集中式版本控制系统,它使用服务器来存储代码库,并通过客户端与服务器进行交互。

SVN提供了许多功能,包括版本控制、分支和合并、冲突解决等,但相对于Git来说,SVN在分支和合并方面的性能较差。

三、Git源码管理的原理和工作机制Git是一种分布式版本控制系统,其原理和工作机制如下:1. 代码库Git使用代码库(Repository)来存储源代码和版本历史记录。

代码库可以在本地或远程服务器上创建。

每个代码库都包含一个完整的源代码副本和一个元数据文件夹。

2. 分支Git允许开发者在代码库中创建多个分支。

分支是代码库的不同版本,开发者可以在不影响主分支的情况下进行开发、修改和测试。

分支可以合并到主分支或其他分支中。

3. 提交开发者在修改代码后,需要将代码提交到代码库中。

linux c程序开发的主要内容

linux c程序开发的主要内容

linux c程序开发的主要内容Linux C程序开发是一种基于Linux操作系统的编程技术,它是利用C语言进行软件开发的过程。

本文将从以下几个方面介绍Linux C程序开发的主要内容。

一、Linux操作系统简介Linux是一种自由和开放源代码的类UNIX操作系统,广泛应用于服务器和嵌入式系统。

Linux操作系统具有稳定性、安全性和灵活性等优点,因此成为了C程序开发的首选平台。

二、C语言基础知识C语言是一种通用的高级编程语言,广泛应用于系统软件、嵌入式系统和游戏开发等领域。

在Linux C程序开发中,熟练掌握C语言的基本语法、数据类型、控制结构、函数和指针等知识是非常重要的。

三、Linux系统编程Linux系统编程是指开发与操作系统相关的程序,包括文件操作、进程管理、线程编程、信号处理、内存管理和网络编程等。

在Linux C程序开发中,需要使用系统调用和库函数来实现这些功能。

1. 文件操作:Linux提供了丰富的文件操作函数,用于创建、打开、读写和关闭文件等操作。

通过文件操作,可以实现文件的读写、复制、移动和删除等功能。

2. 进程管理:Linux采用多进程的方式来实现并发和并行执行。

通过fork()函数可以创建子进程,通过exec()函数可以加载新的程序,通过wait()函数可以等待子进程退出。

3. 线程编程:线程是轻量级的执行单元,可以实现程序的并发执行。

Linux提供了pthread库来支持多线程编程,可以创建、同步和销毁线程。

4. 信号处理:信号是Linux中一种异步事件的通知机制,通过信号可以捕捉和处理各种事件。

Linux提供了signal函数和sigaction 函数来注册和处理信号。

5. 内存管理:Linux提供了malloc和free等函数来进行动态内存的分配和释放。

同时,还可以使用mmap函数将文件映射到内存中,实现文件的高效读写。

6. 网络编程:Linux提供了丰富的网络编程接口,可以实现网络通信和服务端开发。

Linux环境下C语言编译、运行的底层工作原理(2)

Linux环境下C语言编译、运行的底层工作原理(2)

Linux环境下C语言编译、运行的底层工作原理(2)将bss segment、data segment、text segment和堆(heap)、栈(stack)结合起来看内存的分布在vi中将下列代码保存为print_address.c文件#include <stdio.h>#include <stdlib.h>int global_variable;static int file_static_variable;void func1(void){int func1_variable;static int func1_static_variable;printf("&func1_variable\t\t%p\n",&func1_variable);printf("&func1_static_variable\t%p\n",&func1_static_variable);}void func2(void){int func2_variable;printf("&func2_variable\t\t%p\n",&func2_variable);}int main(void){int *p;printf("&func1\t\t\t%p\n",func1);printf("&func2\t\t\t%p\n",func2);printf("String literal\t\t%p\n","abc");printf("&global_variable\t%p\n",&global_variable);printf("&file_static_variable\t%p\n",&file_static_variable);func1();func2();p = malloc(sizeof(int));printf("malloc address\t\t%p\n",p);return 0;}编译运行,得到如下结果:图1 第一次编译运行的结果在保证代码不变的情况下,第二次编译运行,得到如下结果:图2 第二次编译运行的结果在保证代码不变的情况下,第三次编译运行,得到如下结果:图3 第三次编译运行的结果对比三次的运行结果,不难发现,malloc address和&func1_variable、&func2_variable的值每次都在改变。

linux trace原理

linux trace原理

linux trace原理
Linux Trace是一个Linux内核跟踪机制,它可以记录系统中发生的各种事件和操作,如系统调用、进程创建、文件操作等。

Linux Trace的原理可以分为以下几个方面:
1. 事件源:Linux Trace利用内核中的tracepoint机制来实现跟踪。

tracepoint是一种特殊的代码注释,它标识了内核中的关键事件点,当程序运行到这些事件点时,会自动触发相应的跟踪操作。

2. 事件记录:当事件发生时,Linux Trace会生成一个事件记录(trace event)。

事件记录包含了事件的类型、时间戳、进程信息、参数等。

这些事件记录会被保存到内核中的缓冲区中。

3. 缓冲区管理:Linux Trace通过创建一个循环缓冲区来管理事件记录。

缓冲区分为多个段(buffer segment),每个段包含多个事件记录。

当一个段被填满时,Linux Trace会自动切换到下一个段,最后将填满的段写入到磁盘中。

4. 用户空间工具:为了方便用户使用和分析跟踪数据,Linux Trace提供了一些用户空间的工具,如trace-cmd和perf。

这些工具可以从内核中读取事件记录,并进行过滤、分析和可视化。

总的来说,Linux Trace的原理就是通过tracepoint机制捕获内核中的关键事件,将事件记录保存到缓冲区中,最后通过用户空间工具进行分析和可视化。

这样可以帮助开发人员和系统管理员更好地
了解系统的运行状况,发现问题和性能瓶颈。

Linux C 编程

Linux C 编程
设置断点的另一种语法是 break <function>,它在进入指定函数(function)时停住。 相反的,clear 用于清除所有的已定义的断点,clear <function>清除设置在函数上的断点, clear <linenum>则清除设置在指定行上的断点。
watch 命令: watch 命令用于观查变量或表达式的值,我们观查 sum 变量只需要运行 watch sum:
/* filename:main.c */ #include "add.h" main() { int a, b; a = 2; b = 3; printf("the sum of a+b is %d", add(a + b)); } 怎样为上述三个文件产生 makefile 呢?如下:
test : main.o add.o gcc main.o add.o -o test
list 命令: list 命令用于列出源代码,对上述程序两次运行 list,将出现பைடு நூலகம்下画面(源代码被标行号):
根据列出的源程序,如果我们将断点设置在第 5 行,只需在 gdb 命令行提示符下键入如下命令设置断 点:(gdb) break 5,执行情况如下图:
这个时候我们再 run,程序会停止在第 5 行,如下图:
5.小结
本章主要阐述了 Linux 程序的编写、编译、调试方法及 make,实际上就是引导读者学习怎样在 Linux 下编程,为后续章节做好准备。
二 文件系统编程
1.Linux 文件系统 Linux 支持多种文件系统,如 ext、ext2、minix、iso9660、msdos、fat、vfat、nfs 等。在这些具体文件

LinuxCNC入门指南说明书

LinuxCNC入门指南说明书

Getting Started V2.8.1, 2020-11-29 The LinuxCNC Team该手册正在编写中。

如果您能够在编写, 编辑或者图片准备上为我们提供帮助, 联系文档编写团队任何成员,或加入我们团队。

发送电子邮件至***************************.net版权所有©2000-2020 授予复制,分发和/或修改本文档的权限 根据GNU Free Documentation License Version 1.1的条款 或自由软件基金会发布的任何更高版本; 没有不变的部分,没有前封面文字,也没有后封面文字。

许可证的副本包含在标题为“GNU Free Documentation License”中。

LINUX®是Linus Torvalds在美国和其他国家/地区的注册商标。

注册商标Linux®是根据来自Linux商标协会(LMI)分许可证使用, LMI是Linus Torvalds的独家许可持有人,全球范围内商标的所有者。

LinuxC NC项目不属于Debian®。

Debian是公益软件公司(Software in the Public Interest,Inc.)拥有的注册商标,Linux C N C项目不属于UBUNTU®。

B NT是科能软件有限公司(C anonical Limited)拥有的注册商标。

关于LinuxCNC软件•LinuxCNC(增强型机器控制器)是一个软件系统,用于机床(例如铣床和车床),机器人(例如puma 和scara)以及其他最多9轴的计算机控制器。

•LinuxCNC是开源代码的免费软件。

当前版本的LinuxCNC完全根据GNU通用公共许可证和次要GNU通用公共许可证(GPL和LGPL)获得许可•LinuxCNC提供:◦图形用户界面(实际上是几个界面可供选择)◦G代码的解释器(RS-274机床编程语言)◦具有超前的实时运动调度系统◦底层机器电子设备(例如传感器和电机驱动器)的操作◦易于使用的"面包板"层,可为您的机器快速创建独特的配置◦可通过梯形图编程的软件PLC◦使用Live-CD轻松安装•不提供工程图(CAD-计算机辅助设计)或从工程图生成G代码(CAM-计算机自动化制造)的功能。

linux系统下c语言编程基础知识介绍.doc

linux系统下c语言编程基础知识介绍.doc

Linux系统下C语言编程基础知识介绍这篇文章介绍在LINUX K进行C语言编程所需要的基础知识.在这篇文章当中,我们将会学到以下内容:源程序编译Makefile的编写程序库的链接程序的调试头文件和系统求助1.源程序的编译在Linux下面,如果要编译一个C语言源程序,我们要使用GNU的gcc 编译器.下面我们以一个实例来说明如何使用gcc编译器.假设我们有下面一个非常简单的源程序(hello, c): int main (int argc, char **argv)printf( 〃 "Hello Linux 〃〃);要编译这个程序,我们只要在命令行下执行:gcc -o hello hello.cgcc 编译器就会为我们生成一个hello的可执行文件.执行./hello就可以看到程序的输出结果了.命令行中gcc表示我们是用gcc来编译我们的源程序,-o 选项表示我们要求编译器给我们输出的可执行文件名为hello 而hello, c是我们的源程序文件.gcc编译器有许多选项,一般来说我们只要知道其中的几个就够了.-o选项我们已经知道了,表示我们要求输出的可执行文件名.-c 选项表示我们只要求编译器输出目标代码,而不必要输出可执行文件. -g选项表示我们要求编译器在编译的时候提供我们以后对程序进行调试的信息.知道了这三个选项,我们就可以编译我们自己所写的简单的源程序了, 如果你想要知道更多的选项,可以查看gcc的帮助文档,那里有着许多对其它选项的详细说明.2. Makefile 的编写假设我们有下面这样的一个程序,源代码如下:/* main, c */ttinclude 〃 "mytooll.h 〃〃ttinclude 〃z,mytool2. h 〃〃int main(int argc, char **argv) mytooll_print( 〃"hello ” 〃);mytool2_print( 〃 "hello 〃〃);i j/* mytool1. h */ttifndef MYTOOLJ H甘define MYTOOL 1 Hvoid mytooll_print(char Sprint str);ttendif/* mytool1. c */ttinclude 〃z,mytool 1. h 〃〃void mytooll_print(char sprint str) printf ( 〃 "This is mytool 1 print %s 〃,z, print_str);}/* mytool2. h */ttifndef MYTOOL_2 H甘define MYTOOL _2_ Hvoid mytool2_print(char Sprint str);ttendif/* mytool2. cttinclude 〃〃mytool2.h 〃 "void mytool2_print(char *print_str)(printf(,z "This is mytool2 print %s 〃〃,print_str);}当然由于这个程序是很短的我们可以这样来编译gcc-C main, cgcc-C mytooll.cgcc-C mytool2.cgcc-0main main, o mytooll. o mytool2.o这样的话我们也可以产生main程序,而且也不时很麻烦.但是如果我们考虑一下如果有一天我们修改了其中的一个文件(比如说mytooll. c)那么我们难道还要重新输入上面的命令?也许你会说,这个很容易解决啊,我写一个SHELL脚本,让她帮我去完成不就可以了. 是的对于这个程序来说,是可以起到作用的.但是当我们把事情想的更复杂一点,如果我们的程序有儿百个源程序的时候,难道也要编译器重新一个一个的去编译?为此,聪明的程序员们想出了一个很好的工具来做这件事情,这就是make.我们只要执行以下make,就可以把上面的问题解决掉•在我们执行make之前,我们要先编写一个非常重要的文件.Makefile.对于上面的那个程序来说,可能的一个Makefile的文件是:# 这是上面那个程序的Makefile文件main:main, o mytooll. o mytool2. o main. o:main. c mytooll. h mytool2.h gcc ~c main, cmytooll. o:mytooll. c mytooll. h gcc -c mytooll. cgcc -o main main, o mytooll. o mytool2. omytool2. o:mytool2. c mytool2. h gcc -c mytool2. c有了这个Makefile文件,不过我们什么时候修改了源程序当中的什么文件,我们只要执行make命令,我们的编译器都只会去编译和我们修改的文件有关的文件,其它的文件她连理都不想去理的.下面我们学习Makefile是如何编写的.在Makefile中也#开始的行都是注释行.Makefile中最重要的是描述文件的依赖关系的说明.一般的格式是:target: componentsTAB rule第一行表示的是依赖关系.第二行是规则.比如说我们上面的那个Makefile文件的第二行main:main, o mytooll. o mytool2. o表示我们的目标(target) main的依赖对象(components)是main, o mytooll. o mytool2. o 当倚赖的对象在目标修改后修改的话,就要去执行规则•行所指定的命令.就象我们的上面那个Makefile第三行所说的一样要执行gcc -o main main, o mytooll. omytool2. o 注意规则一行中的TAB表示那里是一个TAB键Makefile有三个非常有用的变量•分别是$@, $" $〈代表的意义分别是:$@目标文件,$"所有的依赖文件,$〈第一个依赖文件.如果我们使用上面三个变量,那么我们可以简化我们的Makefile文件为:# 这是简化后的Makefilemain:main, o mytooll. o mytool2. ogcc - o $@ $"main. o:main. c mytooll.h mytool2.hmytooll. o:mytooll.c mytooll.hgcc ~c $ <mytool2. o:mytool2.c mytool2.hgcc -c $ <经过简化后我们的Makefile是简单了一点,不过人们有时候还想简单一点.这里我们学习一个Makefile的缺省规则.c. o: gcc -C $ <这个规则表示所有的・0文件都是依赖与相应的.c文件的.例如mytool. o依赖于mytool. c这样Makefile还可以变为:# 这是再一次简化后的Makefilemain:main, o mytooll. o mytool2. ogcc -o $@ $".c. o:好了,我们的Makefile 也差不多了,如果想知道更多的关于Makefile 规则可以查看相应的文档.3.程序库的链接试着编译下面这个程序temp, cttinclude int main(int argc, char **argv)(double value;printf ( " 〃Value:%f 〃〃, value);!这个程序相当简单,但是当我们用gcc -0 temp temp, c编译时会出现下面所示的错误./tmp/cc33Kydu. o: In function main&acute;&acute;:/tmp/cc33Kydu. o(. text+Oxe): undefined reference to''log&acute;feacute;collect2: Id returned 1 exit status出现这个错误是因为编译器找不到log的具体实现.虽然我们包括了正确的头文件,但是我们在编译的时候还是要连接确定的库.在Linux 下,为了使用数学函数,我们必须和数学库连接,为此我们要加入-Im 选项. gcc -o temp temp, c -Im这样才能够正确的编译.也许有人要问,前面我们用printf函数的时候怎么没有连接库呢?是这样的,对于一些常用的函数的实现,gcc编译器会自动去连接一些常用库,这样我们就没有必要自己去指定了. 有时候我们在编译程序的时候还要指定库的路径,这个时候我们要用到编译器的-L选项指定路径.比如说我们有一个库在/home/hoyt/mylib下,这样我们编译的时候还要加上-L/home/hoyt/mylib.对于一些标准库来说,我们没有必要指出路径.只要它们在起缺省库的路径下就可以了•系统的缺省库的路径/lib /usr/lib /usr/local/lib在这三个路径下面的库,我们可以不指定路径.还有一个问题,有时候我们使用了某个函数,但是我们不知道库的名字,这个时候怎么办呢?很抱歉,对于这个问题我也不知道答案,我只有一个傻办法.首先,我到标准库路径下面去找看看有没有和我用的函数相关的库,我就这样找到了线程(thread)函数的库文件(libpthread.a). 当然,如果找不到,只有一个笨方法.比如我要找sin这个函数所在的库. 就只好用nm -0 /lib/*. so | grep sin> Vs in 命令,然后看〜/sin文件,到那里面去找了. 在sin文件当中,我会找到这样的一行libm-2. 1.2. so:00009fa0 W sin 这样我就知道了sin在libnr2.1. 2. so库里面,我用 -血选项就可以了(去掉前面的lib和后面的版本标志,就剩下m 了所以是-Im).如果你知道怎么找,请赶快告诉我,我回非常感激的.谢谢!4 .程序的调试我们编写的程序不太可能一次性就会成功的,在我们的程序当电会出现许许多多我们想不到的错误,这个时候我们就要对我们的程序进行调试了.最常用的调试软件是gdb .如果你想在图形界面下调试程序,那么你现在可以选择xxgdb.记得要在编译的时候加入-g选项.关于gdb的使用可以看gdb的帮助文件.由于我没有用过这个软件,所以我也不能够说出如何使用. 不过我不喜欢用gdb.跟踪一个程序是很烦的事情,我一般用在程序当中输出中间变量的值来调试程序的.当然你可以选择自己的办法,没有必要去学别人的.现在有了许多IDE环境,里面已经自己带了调试器了.你可以选择儿个试一试找出自己喜欢的一个用.5.头文件和系统求助有时候我们只知道一个函数的大概形式,不记得确切的表达式,或者是不记得着函数在那个头文件进行了说明.这个时候我们可以求助系统.比如说我们想知道fread这个函数的确切形式,我们只要执行man fread 系统就会输出着函数的详细解释的.和这个函数所在的头文件说明了. 如果我们要write这个函数的说明,当我们执行manwrite时,输出的结果却不是我们所需要的. 因为我们要的是write这个函数的说明,可是出来的却是write这个命令的说明.为了得到write的函数说明我们要用man 2 write. 2表示我们用的write这个函数是系统调用函数,还有一个我们常用的是3表示函数是C的库函数。

Linux程序设计基础—gcc

Linux程序设计基础—gcc
• 当你不用任何选项编译一个程序时,GCC将会建立(假定 编译成功)一个名为a.out的可执行文件。
gcc所支持的后缀名解释
.c C源程序 .C/.cc/.cxx/.cpp c++源程序 .m Objective-C原始程序 .i 经过预处理的C原始程序 .ii 经过预处理的C++原始程序 .s/.S 汇编语言原始程序 .h 预处理文件(头文件) .o 目标文件 .a/.so 编译后的库文件
共享库系统自动动态加载
1. 拷贝动态库文件到/lib或/usr/lib去 2. 改变环境变量LD_LIBRARY_PATH $LD_LIBRARY_PATH=$PWD $export LD_LIBRARY_PATH 3. 改变配置文件/etc/ld.so.conf 执行ldconfig
检查库依赖关系
警告选项
• 在gcc中用开关-Wall控制警告信息,使用 示例命令如下:
gcc –Wall -o test3_1 test3_1.c
• -w 不生成任何警告信息。
查找选项
• gcc一般使用默认路径查找头文件和库文件。如果 文件所用的头文件或库文件不在缺省目录下,则 编译时要指定它们的查找路径。 – -I选项:指定头文件的搜索目录 例: gcc –I/export/home/st –o test1 test1.c – -L选项:指定库文件的搜索目录 例: gcc –L/usr/X11/R6/lib –o test1 test1.c
• -pg选项:告诉GCC在你的程序里加入额外的代码,执行 时,产生gprof用的剖析信息以显示你的程序的耗时情况。
静态库与动态库
• 静态库:在编译过程中将库函数代码直接加入到生成的可执 行程序中,程序运行过程中不需要利用库函数 • 共享库:编译时,只是在生成的可执行程序中简单指定需要 使用库函数信息,程序运行过程中需要利用库函数 • 动态库:共享库的一种变化形式,目前大都采用共享库的方 式 • 命名方式: 静态库:前缀lib+库名+.a(libm.a,libstdc++.a等) 共享库:前缀lib+库名+.so+版本号(libm.so.6,libc.so.6)
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

opLINUXCNC 源程序学习源程序的树结构如下:Overview of the emc2 directory (generated by tree -I .git -d) : |-- app-defaults |-- bin (user mode binaries)|-- configs|-- 5axis|-- boss|-- common|-- dallur-thc|-- demo_mazak (sample mazak config files)|-- demo_sim_cl (sample sim with ladder IO)|-- demo_step_cl (sample stepper with ladder IO)|-- etch-servo|-- halui_halvcp|-- hexapod-sim|-- lathe-pluto|-- m5i20 (sample servo using Mesa PCI)|-- max|-- motenc (sample servo using Vital PCI)|-- nist-lathe|-- plasma-thc|-- plasma-thc-sim|-- ppmc|-- puma|-- scara|-- sim (simulated motion and IO)|-- stepper (parport stepper driver)|-- stepper-gantry|-- stepper-xyza|-- stg (sample servo using STG ISA)|-- univpwm (sample PICO servo generator)|-- univstep (sample PICO stepper generator)、--vtidebian (files needed to build deb packages)| |-- extras-Ubuntu-5.10 (extra files for Ubuntu 5.10)| | |-- etc| | | |-- modprobe.d| | | |-- udev| | | | |-- rules.d| | | | 、-- scriptsII I '-- xdg |||、-- menus || | '-- applicati on s-merged || 、-- usr || 、-- share II I-- applications II I-- desktop-directories | | 、-- pixmapsI I-- extras-Ubuntu-6.06 (extra files for building on Ubuntu 6.06 Dapper Drake)I I I-- etcI I I I--modprobe.dI I I I--udevI I I I I-- rules.d|| | | 、-- scripts II I '-- xdg || | 、-- menus II I '-- applicati on s-merged II 、-- usr I I、-- share I II-- applications II I-- desktop-directories I I 、-- pixmapsI I-- extras-Ubuntu-7.10 (extra files for building on Ubuntu 7.10)I I I-- etcI I I I-- modprobe.d I I I '-- xdgII I 、-- menus II I '-- applicati on s-merged II 、-- usr I I 、-- shareI I I I I I I I I II I I I I I I I I I I I I I I I-- etc I I-- modprobe.d I I-- udev I I '-- rules.d I '-- xdg I 、-- menus I '-- applicati on s-merged '--usr 、--share I-- applications I-- desktop-directories 、--pixmaps I-- extras-Ubuntu-8.04 (extra files for building on Ubuntu 8.04 Hardy Heron)I I I-- applicationsI I I-- desktop-directories| | 、-- pixmaps| |-- extras-sim-Ubuntu-5.10 (extra files for sim package for Ubuntu 5.10)| | |-- etcI I I'-- xdg||| 、-- menus| | | '-- applicati on s-merged| | 、--usr| | 、-- shareI I I-- applicationsI I I-- desktop-directories| | 、-- pixmaps| '-- extras-sim-Ub un tu-6.06 (extrafiles for sim package for Ubuntu 6.06 Dapper Drake)I I-- etcI I'-- xdg| I 、-- menusI I '-- applicati on s-mergedI '-- usrI 、-- shareI I-- applicationsI I-- desktop-directoriesI 、-- pixmapsI-- docs (All the important and relevant Docs.)I I-- helpI I-- html (html version of docs - some generated from lyx)I I-- man (man pages)I I I-- man1I I I-- man3I I 、-- man9I '-- src (API and source notes should be in each src dir.) (source for the handbooks) (top level」yx files) I I-- codeI I-- common (shared .lyx files and images, such as glossary, GPLD license)I I-- configI I-- gcode (.lyx files, images, etc. for G-Code documentation)I I-- gui (.lyx files, images, etc. for GUI documentation)I I-- hal (.lyx files, images, etc. for HAL documentation)I I-- installI I-- ladderI I--motionI '-- quickstartI-- include (headers installed here - originals in src/xxx/)I-- lib (user mode object files)I 、-- pyth onI I-- rs274 I '-- yapps|-- nc_files (Sample NC files)|-- rtlib (kernel mode object files, only after a successfull compile)|-- scripts(bash scripts like linuxcnc, realtime, rip-environment, etc.) |-- share |-- axis| |-- images| '-- tel|-- emc'--locale|-- de| '-- LC_MESSAGES|-- es| '-- LC_MESSAGES|-- fr| '-- LC_MESSAGES|-- hu| '-- LC_MESSAGES|-- it| '-- LC_MESSAGES|-- pt_BR| '-- LC_MESSAGES|-- ro| '-- LC_MESSAGES|-- ru| '-- LC_MESSAGES|-- se| '-- LC_MESSAGES|-- sr| '-- LC_MESSAGES'--zh_CN'--LC_MESSAGES|-- src (source tree - configure script, top level makefile, Makefile.inc, etc) || | | | | | | | | | | ||-- depends (generated dependency tree)||-- emc (actual LinuxCNC code)| |-- canterp| |-- ini| |-- iotask| |-- kinematics| |-- motion| |-- nml_intf| |-- rs274ngc| |-- sai| |-- task(interpreter for canonical commands)(inifile related operations) (IOinterface, lots of HAL pins)(trajectory planner and kinematics)(motion controller, talks through SHM to the rest of EMC)(emc specific NML implementation, all messages sent in emc)(the rs274 g-code interpreter)(core component in emc, dispatches actions to other parts)| | | | | | | | | | | | | | | | | | | | | | || | 、-- usr_i ntf (interfaces for some GUIs, and other interfaces: AXIS, halui, stepconf)| | |-- axis| | | |-- etc| |-- extensions| 、-- scripts'--stepc onf| |-- hal (the Hardware Abstraction Layer, provides a unified interface across all hardware)| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |||||||||||||||||||||||||||||||||-- classicladder| '-- projects_examples|-- components|-- drivers|||||||||||||||||||||||-- m5i20| |-- bit| '-- hostmot5_src|-- mesa-hostmot2|-- doc'--firmware|-- 5i20| '-- SOURCE'--7i43|-- CPLD| '-- SOURCE'--SOURCE|||||||||-- mesa7i43-firmware||||||--||-- gpio| '-- source|-- hostmot2| 、-- src'--sourcemesa_5i2x'--firmware|-- pluto_servo_firmware'--pluto_step_firmware|-- user_comps| |-- devices| 、-- vcp'--utils'--halgui|-- libnml (a clean implementation of RCSLIB)| | |-- buffer | | |-- cms | | |-- inifile | | |-- linklist | | |-- nml| | |-- os_intf| | |-- posemathI I '-- res| |-- module_helperI I-- objeetsI I I-- emeI I I I-- eanterpI I I I-- iniI I I I-- iotaskI I I I-- motionI I I I-- nml_intfI I I I-- rs274ngeI I I I-- saiI I I I-- task| | | '-- u sr_i ntf| | | 、-- axis| | | '-- exte nsions I I I-- halI I I I-- elassieladderI I I I-- eomponentsI I I I-- driversI I I I-- user_eompsI I I I I-- deviees||||'-- vep III'-- utilsI I I-- libnmlI I I I-- bufferI I I I-- emsI I I I-- inifileI I I I-- linklistI I I I-- nmlI I I I-- os_intfI I I I-- posemathI I I '-- resI I I-- rtapiI I I-- rtemeI I I I-- kinematiesI I I '-- motionI I I-- rthalI I I I-- elassieladderI I I I-- eomponentsI I I '-- utilsI I I-- rtlibnmlI I I '-- posemathI I '-- rtobjeets| | '-- hal| | '-- comp onents| |-- po (Translation files for i18n support)| |-- rtapi (*.c and *.h for RTAPI) (unified RT API, wraps over RTLinux, RTAI and sim) | | '-- examples (test ing examples for the RTAPI)| | |-- extint| | |-- fifo| | |-- semaphore| | |-- shmem| | 、-- timer| '-- tests|-- tcl (tkemc.tcl, mini.tcl - the tcl GUI's)| |-- bin| 、-- scripts'--tests|-- abs.0|-- and-or-not-mux.0|-- basic|-- ccomp| |-- lathe-comp| |-- mill-g90g91g92| |-- mill-line-arc-entry| '-- mill-zcha nges|-- counter-encoder.0|-- flipflop.0|-- interp| |-- cam-nisley| '-- flows nake|-- limit3.0|-- limit3.1|-- limit3.2|-- modparam.0|-- overrun|-- oword| '-- sub.O|-- save.0|-- save.1|-- source.0|-- stepgen.0|-- stepgen.1|-- stepgen.2|-- threads.0'--timedelay.0Overview of the emc2 install dirs:/ (file system root)|||--- etc/| || \--- init.d/| || \--- realtime (realtime start/stop script)|||--- $(prefix) (default: /usr/local)| | (all the following $xxxxdir are configurable through autoconf | || |--- bin/ (known as $bindir, files from EMC2/bin)| || |--- sbin/ (known as $sbindir, )| || |--- etc/ (known as $sysconfdir, config files and subdirs from configs/)| || |--- lib/ (known as $libdir, lib files *.so from libs/)| || \--- share/| || \--- emc/| || || |--- docs/| | || | \--- (All the important and relevant Docs.)| || |--- handbooks/| \--- (PDF versions of handbooks) \--- nc_files/\--- (Sample NC files)|--- $MAN_DIR/ (default: /usr/local/man)| || |--- man1/| | || || || \--- man3/| || |\--- $moduledir/ (based on where ./configure finds the RTOS modules) 根据这个结构树,我们可以清楚的知道每一个文件夹,每一个子文件的作用,包括了接口,硬件抽 象层,实时内核等等部分。

相关文档
最新文档