Linux下项目开发工具(gcc,makefile,git)
2017-02-28 20:07
405 查看
GCC编译器
简介
GCC(GNU Compiler Collection,GNU编译器套件// GUN is Not Unix),是由 GNU 开发的编程语言编译器。它是以GPL许可证所发行的自由软件,也是 GNU计划的关键部分。GCC原本作为GNU操作系统的官方编译器,现已被大多数类Unix操作系统(如Linux、BSD、Mac OS X等)采纳为标准的编译器,GCC同样适用于微软的Windows。GCC 原名为 GNU C 语言编译器(GNU C Compiler),因为它原本只能处理 C语言。GCC 很快地扩展,变得可处理 C++。后来又扩展能够支持更多编程语言,如Fortran、Pascal、Objective-C、Java、Ada、Go以及各类处理器架构上的汇编语言等,所以改名GNU编译器套件(GNU Compiler Collection)。
执行过程
使用gcc由C语言源代码文件生成可执行文件的过程不仅仅是编译的过程,而是要经历四个相互关联的步骤∶预处理、编译、汇编和链接。命令gcc首先调用cpp进行预处理,在预处理过程中,对源代码文件中的文件包含、预编译语句进行分析。接着调用cc1进行编译,这个阶段根据输入文件生成以.i为后缀的目标文件。汇编过程是针对汇编语言的步骤,调用as进行工作,一般来讲,.S为后缀的汇编语言源代码文件和汇编、.s为后缀的汇编语言文件经过预编译和汇编之后都生成以.o为后缀的目标文件。当所有的目标文件都生成之后,gcc就调用ld来完成最后的关键性工作,这个阶段就是连接。在连接阶段,所有的目标文件被安排在可执行程序中的恰当的位置,同时,该程序所调用到的库函数也从各自所在的档案库中连到合适的地方。
gcc格式
gcc [-c|-S|-E] [-std=standard] [-g] [-pg] [-Olevel] [-Wwarn...] [-Wpedantic] [-Idir...] [-Ldir...] [-Dmacro[=defn]...] [-Umacro] [-foption...] [-mmachine-option...] [-o outfile] [@file] infile...
动态库静态库的生成
动态库编译gcc -fpic -shared a.c b.c -o libtest.so
链接不到动态库的解决方案
export LD_LIBRARY_PATH=. // 设置环境目录 sudo cp libtest.so /usr/lib // 把库拷贝到系统库目录
通过代码链接动态库
#include <dlfcn.h> typedef void(*func)(); int main() { void* funlib = dlopen("use/lib/libtest.so",RTLD_LAZY); func myfunc = (func)dlsym(funlib, "foo"); mufunc(); dlclose(funlib); }
关于插件功能的简单实现
#include <stdio.h> #include <dlfcn.h> #include <dirent.h> typedef void(*func)(); int main() { char buf[256]; DIR* dir = opendir("./xxx"); struct dirent* entry; while(entry = readdir(dir)) { if(entry->d_name[0] == '.') continue; sprintf(buf, "./xxx/%s", entry->d_name); void* handle = dlopen(buf, RTLD_LAZY); func myfunc = (func)dlsym(handle, "foo"); myfunc(); dlclose(handle); } }
静态库打包
ar rcs libtest.a a.o b.o // 通过gcc -c a.c编译成.o文件
当同时存在动态静态库时,通过-l链接的优先是链接动态库 加上-static则是默认所有链接都是静态库
项目管理Makefile
简介
make是一个命令工具,它解释Makefile 中的指令。在Makefile文件中描述了整个工程所有文件的编译顺序、编译规则。Makefile 有自己的书写格式、关键字、函数。像C 语言有自己的格式、关键字和函数一样。而且在Makefile 中可以使用系统shell所提供的任何命令来完成想要的工作。Makefile在绝大多数的IDE 开发环境中都在使用,已经成为一种工程的编译方法。基本元素
目标: 依赖 命令
目标:目标文件, 可以是 Object File, 也可以是可执行文件
依赖:生成 target 所需要的文件或者目标
命令: make需要执行的命令
目标可以有多个依赖,依赖有传递性。make命令去执行Makefile,Makefile的名字固定为Makefile或者makefile,如果名字不是固定的名字,需要用-f指定makefile。
make默认生成第一个依赖项。如果想生成其他依赖项,直接在make后跟依赖项即可。比如make install。约定俗成第一个目标一般叫做all。
变量
可以使用变量来简化Makefile,定义变量可以使用allobj := a.o b.o c.o # allobj = a.o b.o c.o a.out: $(allobj) gcc a.o b.o c.o a.out: $(allobj) gcc $^ make的自动变量 # $^ 表示所有依赖项 # $< 表示第一个依赖项 # $@ 表示目标
其中 = 和 := 的区别在于 —— 如果使用:=那么立即赋值,使用=那么使用时才赋值。
缺省规则
缺省规则是make系统提供默认的规则,比如x.o如果没有指定规则,那么默认有:x.o: x.c $(CC) -c $(CPPFLAGS) $(CFLAGS) $<
使用函数
Makefile 中自带了一些函数, 利用这些函数可以简化 Makefile 的编写调用语法如下:
$(<function> <arguments>) # 或者 ${<function> <arguments>}
是函数名
是函数参数
shell函数可以用来执行shell命令,并且将标准输出赋值给变量。
allc := $(shell ls *.c) allcpp := $(shell ls *.cpp)
替换.c为.o
all b9d3 obj := $(allc:.c=.o) allobj := $(allcpp:.cpp=.o)
使用子Makefile
可以通过include包含其他子makefile。include mymk.mk # 使用-开头表示如果mymk.mk不存在,那么也继续执行 -include mymk.mk
自动推导依赖
main : main.o gcc -o main main.o #会自动变为: main : main.o gcc -o main main.o main.o: main.c gcc -c main.c
版本管理git
简介
Git 是用于 Linux内核开发的版本控制工具。与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持,使源代码的发布和交流极其方便。 Git 的速度很快,这对于诸如 Linux kernel 这样的大项目来说自然很重要。个人使用
步骤1:安装 sudo apt-get install gitWindows: gitbash(百度搜索)
步骤2:创建代码仓库
git init
该命令在当前目录下,创建一个git仓库
步骤3:将修改的代码加入到仓库
git add lm.c
git commit -m “version1”
步骤4:步骤3重复执行多次
步骤5:提交内容可以通过
git revert进行撤销
步骤6:可以通过分支来进行大版本管理
git branch查看当前仓库的分支
git branch {branchname} 在当前分支的状态下,创建分支
git checkout {branchname}切换分支
git branch -d {branchname}删除分支
git branch -D {branchname} 强制删除有代码修改的分支,慎重使用
第一次使用git提交代码之前,应该使用
git config –global user.name “your name”
git config –global user.email “your email”
合作开发
git push 远程服务器名字 本地分支:远程分支// 把代码库中的代码上传到git服务器
git pull 远程服务器名字 分支名字
// 从git服务器上下载代码
git init xxxx –bare
// 在服务器上创建代码库
git clone 服务器名字ip:远程代码路径
// 克隆服务器的目录
git merge 分支号
//将指定的分支代码
暂存区
Git和其他版本控制系统如SVN的一个不同之处就是有暂存区的概念。前面讲的个人使用步骤3:
第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区; 第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。
所谓暂存区可简单理解为需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。
常用命令
git help < command > # 显示command的helpgit show # 显示某次提交的内容 git show $id
git add < file > # 将工作文件修改提交到本地暂存区
git rm < file > # 从版本库中删除文件
git revert < $id > # 恢复某次提交的状态,恢复动作本身也创建次提交对象
git diff < file > # 比较当前文件和暂存区文件差异 git diff
git log git log < file > # 查看该文件每次提交记录
git br < new_branch > # 创建新的分支
git co < branch > # 切换到某个分支
git br -d < branch > # 删除某个分支
git merge < branch > # 将branch分支合并到当前分支
git stash # 暂存
git stash list # 列所有stash
相关文章推荐
- Linux 开发工具 ---gcc makefile gdb
- Linux 开发工具学习(gcc 、gdb和makefile)
- 搭建arm-linux-gcc交叉编译工具链环境(Android原生(JNI)开发环境搭建)
- 用C++语言做Linux开发工具之粘合剂Makefile
- 分类: linux程序设计 2012-03-06 22:01 10646人阅读 评论(5) 收藏 举报 linux语言c工具gcc程序开发 调试是每个程序员都会面临的问题. 如何提高程序员的调
- Linux下开发环境(gcc/g++/makefile/gdb)
- linux开发工具--Makefile(1) 简单的Makefile规则和Makefile自动变量
- 一步一步学习嵌入式Linux开发-C3-使用git管理项目1
- Vs2012在Linux开发中的应用(6):改写Makefile项目的Build过程
- 项目开发版本控制工具之常用git命令总结
- 使用Git 作为项目管理工具开发时的方式和注意事项
- Linux下C开发工具介绍 GCC gdb xxgdb calls calltree cprot
- 一步一步学习嵌入式Linux开发-C3-使用git管理项目2
- Linux开发工具_4_Makefile入门(下)
- linux环境开发工具之makefile文件
- GIT-Linux 内核开发的版本控制工具
- Linux c 开发 - Makefile工具
- Linux开发工具_2_gcc入门(下)
- Linux开发工具_3_Makefile入门(上)
- linux 商业项目 makefile 自动生成工具Autotools的使用