赞
踩
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 [-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则是默认所有链接都是静态库
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)
可以通过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 是用于 Linux内核开发的版本控制工具。与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持,使源代码的发布和交流极其方便。 Git 的速度很快,这对于诸如 Linux kernel 这样的大项目来说自然很重要。
第一次使用git提交代码之前,应该使用
git config –global user.name “your name”
git config –global user.email “your email”
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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。