包管理器

编译器

gcc
Clang

调试器

gdb

Valgrind

测试内存使用错误

gprof

代码剖析器

make

pkg-config

pkg-config是向程序提供相应库的路径、版本号等信息的程序。
如:
$pkg-config –libs –cflags opencv
会显示如下信息:
-I/usr/include/opencv -lcxcore -lcv -lhighgui -lcvaux
得到的是用gcc编译连接时CFLAGS的参数。因此当我们需要编译连接某个库时,我们只需要把上面那行加入gcc 的参数里面即可。这也是configure的作用,它会检查你需要的包,产生相应的信息。
那pkg-config从哪儿知道这些信息的呢?它是从包名为xxx.pc这个文件中查找到的。拿上面那个例子说,它是从opencv.pc这个文件中查知的。
那pkg-config 又怎么会知道opencv.pc这个文件呢?下面我们看一下pkg-config是怎样工作的。
缺省情况下,pkg-config首先在prefix/lib/pkgconfig/中查找相关包(譬如opencv)对应的相应的文件(opencv.pc)。在linux上上述路径名为 /usr/lib/pkconfig/。若是没有找到,它也会到PKG_CONFIG_PATH这个环境变量所指定的路径下去找。若是没有找到,它就会报错,例如:
Package opencv was not found in the pkg-config search path. Perhaps you should add the directory containingopencv.pc’
to the PKG_CONFIG_PATH environment variable
No package ‘opencv’ found
`

寻找库的工具,使用见下面库文件的路径。

产生文档的工具

编辑器的选择

Emacs
vim
Kate
nano

一些IDE的选择

Autotools

Git

shell的替代品

常用的编译器选项

-g - 加入调试符号
-std=gnu11 - C11标准
-O2 - 优化等级
-Wall - 添加编译器警告

库的路径

C程序设计时,常常遇到找不到路径的问题。
对路径的理解,有助于问题的排查。

库文件在哪里

典型的情况下,库存放的地方至少有三个:
1、操作系统预定义的安装库文件的目录
2、本地系统管理员的库安装目录,不会被操作系统的更新覆盖
3、通常情况下用户没有访问一些位置的权利,所以将一些库文件存放着用户主目录下
例子:
假如名为Libuseful的库安装在/usr/local/目录下,代码里已经包含了头文件#include <useful.h>。则可以用以下命令:
gcc -I/usr/local/include use_useful.c -o use_useful -L/usr/local/lib -luseful
• -I 指定搜索头文件的路径
• -L 指定库的搜索范围
• 注意库的顺序:如果specific.o依赖于Libbroad库,Libbroad依赖于Libgeneral,则库的顺序通常为gcc specific.o -lbroad -lgeneral才会成功。

库文件的查找

搜索库的命令:(POSIX环境)
find /usr -name 'libuseful*'
一般情况下,如果库的目标文件在/somepath/lib,那么对应的头文件一定在/somepath/include
查找库的工具pkg-config
pkg-config --libs libxml-2.0 得到输出:-lxml2
pkg-config --cflags libxml-2.0 得到输出:-I/usr/include/libxml2
即得到的是编译LibXML2所需要的所有选项。
在shell中,当把命令行用反引号包围时,这个命令行的反引号部分会被其自身的输出代替。
故输入:

1
gcc `pkg-config --cflags --libs libxml-2.0` -o specific specific.c

等价于:

1
gcc -I/usr/include/libxml2 -lxml2 -o specific specific.c

在命令行里包含头文件

gcc -include stdio.h
可以自己设置统一的头文件,包含通用的一些头文件,供编译时使用。(偷懒的做法)

Makefile的使用

一个基本的makefile:

1
2
3
4
5
6
P=program_name
OBJECTS=
CFLAGS = -g -Wall -O3
LDLIBS=
CC=c99
$(P): $(OBJECTS)

$(var) 设置变量
$@ 返回完整的目标文件名
$* 不带文件名后缀的输出文件
$< 当前目标的文件名称

1
2
target: dependencies
script

…关于make的使用有待补充

Here Documents & Compiling from stdin

Comments