GNU开发基础

一、 GNU开发环境基础

GCC和GDB
GCC(GNU C Compiler)是GNU项目中符合ANSI C保准的编译系统,能够编译用C ,C++ 。Objiect C等语言编写的程序。同时GCC也是一个交叉编译器,特别适用于不同平台的嵌入式开发

gcc程序编译过程
.c源代码——>.i预编译文件——>.s汇编文件——>.o目标文件——>可执行文件
预处理 编译 汇编 链接

gcc参数分类

常用参数
gcc -S
gcc -E
gcc -o

1.编译相关参数
-c 只编译不连接,生成目标文件.o
-S只编译不汇编,生产汇编代码
-E只进行预处理
-g包含调试信息
-o filename 指定目标输出文件
-I 搜索头文件路径

2.GCC编译动态链库然后调用
**静态链接库:**编译时把库文件完全包含在成可执行文件,会使文件臃肿 .lib+name.a
生成指令:
ar crv +{.a} +[.o}
调用静态链链接库: gcc -o【file】【file.c】-L+库地址 库名与前面的/中间一定要有空格

**动态链接库:**运行时调用而不是编译时调用,发布时要可执行文件加类库文件 lib+name.so【主版本号,此版本号,发行号】
1.生产于位置无关的目标代码 gcc -fPIC -c 【.c】
gcc -shared -o .so .o

-static 静态编译(gcc默认是静态编译所以一般不加 )
-shared 1、生成动态库文件2、进行动态编译
-L +文件夹 库文件搜索中添加路径
-fPIC 生成使用相对位置无关的目标代码,然后通常用于使用GCC的-static选项从该PIC目标文件生成动态库

第一种方法:把。so文件放到/usr/lib中去
第二种方法:改变环境变量,设.so文件在/home/ss中
export LD_LIBRARY_PATH=/home/ss/xxx.so:$LD_LIBRARY_PATH
第三种方法:在/etc/ld.so.conf文件里加入我们生成的库的目录,然后/sbin/ldconfig
ld.so.conf是非常重要的一个目录。里面存放的是连接器和加载器搜索共享库时要检查的目录,默认是从/usr/lib中读取,所以我们把自己库的目录加进去后执行/sbin/ldconfig脚本。
3.警告选项
-w 关闭所有警告
-Wall 发出gcc提供的所有警告
-pedantic 发出ansic所有警告
4.优化选项
-O+数字,优化等级 优化等级一般最终发布才用

GDB(调试)

gcc -g带调试信息就是gdb
打断点
b(reak) +函数名
break+行号
break+文件名:行号
break+行号if+条件
查看断点
info break
删除断点
delete

运行
r(un)
c(ontinue)(遇到断点后)
q(uit)
单步调试
n(ext)——step over如果正在调用一个子函数则会调用完子函数不进入内部
s(tep)——step into会进入子函数内部
f(inish)——step return直接返回当前函数
打印值
p(rintf)值
监控值
w(atch)值
Eclipse Linux 下的使用

makefile

作用:1.工程文件的组织,编译成复杂的程序 2.安装程序

运行make命令会自动去读取找到目录中makefile文件

makefile的编写规则 makefile中#代表注释
target(目标):prerequisites(依赖)
(此处为一个TAB的缩进) command(命令)
例:
hello:main.c fun1.c fun2.c
gcc main.c fun1.c fun2.c -o hello

也可以:
hello:main.o fun1.o fun2.o
gcc main.o fun1.o fun2.o -o hello
main.o:main.c
gcc -c main.c
fun1.o:fun1.c
gcc -c fun1.c
fun2.o:fun2.c
gcc -c fun2.c

clean:(清除垃圾文件)
rm fun1.o fun2.o main.o

install:
cp hello usr/local/hello
uninstall
rm /usr/local/hello

makefile变量
1.用户定义变量
例MY = main.o fun1.o fun2.2
hello:$(MY)
gcc $(MY) -o hello
类似C中预处理
2.预定义变量
AR 库文件维护程序名,默认值为ar
AS 汇编程序的名称,默认为as
CC C编译器名称,默认为cc
CXX C++编译器的名称。默认为g++
ARFLAGS 库文件维护程序选项,无默认值
ASFLAGS 汇编程序的选项,无默认值
CCFLAGS C编译器的选项,无默认值
CXXFLAGS C++编译器的选项,无默认值

自动变量及环境变量
$* 不包含扩展名的目标文件名称
$< 第一个依赖文件名称
$? 所有时间戳比目标文件晚的依赖文件
$@ 目标文件的完整名称
$^ 所有不重复的依赖文件

如在main,o:里用$*就表示main

伪目标
.PHONY

.PHONEY:clean
clean:
rm fun1.o fun2.o main.o
防止文件夹中有同名文件,加了为目标之后使用make clean 就会认为是伪目标而不会去执行别的文件
命令行前加@就会不执行这条命令

引用其它makefile以及makefile嵌套
包含:
include proc/makefile include后面跟包含的文件就可
嵌套:
subsystem:
cd subdir&& $(MAKE)指令 例如 gcc -c main.c
等价于
subsystem
$(MAKE)-C subdir

条件判断
ifeq
else
makefile管理命令
-C 文件名 读入指定目录的makefile
-f 文件名 读入当前目录下的file文件为makefile
-i忽略所有命令执行错误
-I (大写的i) 文件名 指定被包含的makefile所在目录

用伪目标生成多个文件
all:org1.o org2.o all 的依赖文件为org1和org2
.PHONY:all 声明它是伪目标
org1.o: org1.o xxx.o
cc -o org1 org1.o xxx.o
org2:org2.o
cc -o org2 org2.o
就会生成org1 和org2两个文件

autotools

在这里插入图片描述对configure.ac内部进行少部分编辑
AC_INIT后面需要加入三个参数,文件名版本号邮箱(发生BUG时提交)
eg:AC_INIT([email protected])
AC_CONFIG_HEADERS([config.h])不用头文件的话可以注释掉
添加一个宏
AM_INIT_AUTOMAKE(里面的参数为上面的生成文件名加版本号 )
AC_OUTPUT要加上输出(makefile)
在这里插入图片描述
需要自己建立makefile.am
内容:
bin_PROGRAMS =hello(要生成的文件名)
zardoz_SOURCES = hello.c(所需要的源代码)
在这里插入图片描述
最后运行configure文件 ./configure
make dist 可以把程序做成压缩包

{引荐
首先进入 project 目录,在该目录下运行一系列命令,创建和修改几个文件,就可以生成符合该平台的Makefile文件,操作过程如下:

  1. 运行autoscan命令

  2. 将configure.scan 文件重命名为configure.in,并修改configure.in文件

  3. 在project目录下新建Makefile.am文件,并在core和shell目录下也新建makefile.am文件

  4. 在project目录下新建NEWS、 README、 ChangeLog 、AUTHORS文件

  5. 将/usr/share/automake-1.X/目录下的depcomp和complie文件拷贝到本目录下

  6. 运行aclocal命令

  7. 运行autoconf命令

  8. 运行automake -a命令

  9. 运行./confiugre脚本

可以通过图2看出产生Makefile的流程,如图所示:
在这里插入图片描述
————————————————
版权声明:本文为CSDN博主「ztguang」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/ztguang/article/details/51015373

}

发布了33 篇原创文章 · 获赞 4 · 访问量 2619

猜你喜欢

转载自blog.csdn.net/CNMNMSL1/article/details/104292428
GNU