Linux下项目开发工具(gcc,makefile,git)

本文介绍了GCC编译器的功能与执行过程,包括预处理、编译、汇编和链接等步骤,并展示了如何生成动态库和静态库。此外,还详细讲解了Makefile的基本元素、缺省规则及如何使用变量和函数简化Makefile编写。
摘要由CSDN通过智能技术生成

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

allobj := $(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 git
    Windows: 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的help

  • git 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值