linux下c编程

来源:互联网 发布:千牛mac版不能用了吗 编辑:程序博客网 时间:2024/04/28 12:15

1.gcc常用编译选项

-o 指定输出文件名
-c 只编译不链接
-Istr (大写i开头)将路径str添加到头文件搜索目录
-Lstr 将路径str添加到库文件搜索目录
-lSTR (小写L开头)链接名称为libSTR的函数库文件
-g 在生成的可执行文件中包含调试信息,供gdb程序使用
-ON 对编译代码进行优化N为0-3,-O相当于-O1
编译C++语言的文件使用g++,参数选项类似。


2.makefile文件

make程序会从当前目录自动查找GNUmakefile,makefile和Makefile文件.
常用的参数有-f指定makefile文件,make后面直接加目标表示执行的目标;后面不加参数的话,会把第一个目标作为默认执行的,第一个目标名通常是all,all仅仅只是一个伪目标。
当执行的目标比其后的任一个依赖文件要旧时,就会重新执行目标下面的命令;在判断之前,会先去依次判断各个依赖文件是否为最新,即先去处理以依赖文件为目标的那些块。这是个递归的过程。
makefile文件遵循以下结构:
#remark
target:file1 file2 [...]
command1
command2
[...]
命令前必须以tab制表符开头.
采用伪目标时,也没有依赖文件,用来完成特定的任务.
变量无须声明,直接使用=赋值.使用时为$(变量名)格式.
在目标模式和依赖模式中,如果包含模式字符“% ”,表示使用自动循环取匹配的目标模式和依赖模式,可以配合使用$<变量。
特殊变量:
$@目标文件名,
$^所有依赖文件名,以空格分隔.
$<代表规则中通过目录搜索得到的依赖文件列表的第一个依赖文件。

举例:
CXXFLAGS = -g -pg -finline-functions -Wall -Winline -pipe#under source dir.INCDIR = ./includeULIB = ./libTHIRDPATH = ../../third/INCLUDEDIR=             -I$(INCDIR)/ul -I$(THIRDPATH)/tinyxml/LIBDIR=                 -L$(ULIB)  -lullibCC  = gccCPP = g++CXX = gccEXECUTABLE = myProgramall     :  $(EXECUTABLE)        rm -f *.oclean   :        rm -f *.o $(EXECUTABLE)$(EXECUTABLE)   : main.o son1.o son2.o        $(CPP) -o $@ $^ $(LIBDIR) $(INCLUDEDIR) -lm -lpthread%.o     : %.cpp        $(CPP) $(CXXFLAGS) -c $< -o $@ $(INCLUDEDIR)


3.configure命令

configure命令利用Makefile.in文件通过变量替换生成Makefile文件.这样可以为编译生成正确的本地配置.
安装程序打包过程:
(1)编辑生成helloworld.c源文件
(2)执行命令autoscan,生成configure.scan文件,改名为configure.in后进行编辑
(3)执行命令aclocal,生成宏脚本aclocal.m4
(4)执行命令autoconf,生成configure文件
(5)编辑生成Makefile.am文件
(6)执行命令automake --add-missing,生成Makefile.in等文件
(7)执行命令./configure来生成Makefile文件
(8)执行命令make来编译代码,生成可执行程序helloworld


4.linux下编程的常见事项:

1. 使用VIM打造IDE环境

使用vi编辑时,c语言相应的关键字会以彩色显示,十分方便,只是默认没有缩进。可以按如下教程进行配置:http://blog.csdn.net/wooin/article/details/1858917。其配置要点如下:

~/.vimrc文件如下:
set fileencodings=utf-8,gb18030set encoding=cp936set termencoding=gb18030language messages zh_CN.UTF-8 syntax enablesyntax oncolorscheme desert"只对指定的编程文件类型生效。分别设置了Tab展示为4个空格,将Tab替换为空格;换行自动保持缩进;括号等进行自动补全autocmd FileType js,rb,ruby,sh,shell,cpp,php,htm,html set tabstop=4 | set shiftwidth=4 | set expandtab | set autoindent | inoremap ( <c-r>=AutoPair('(', ')')<CR> | inoremap [ <c-r>=AutoPair('[', ']')<CR> | inoremap { <c-r>=AutoBracket()<CR> | inoremap < <c-r>=AutoPair('<', '>')<CR> | inoremap > <c-r>=ClosePair('>')<CR> | inoremap ) <c-r>=ClosePair(')')<CR> | inoremap ] <c-r>=ClosePair(']')<CR> | inoremap } <c-r>=CloseBracket()<CR>function AutoPair(open, close)    "只对两者情况补全,一是光标在行末,二是光标下一个字符是空格    let line = getline('.')    if col('.') > strlen(line) || line[col('.') - 1] == ' '        return a:open.a:close."\<ESC>i"    else        return a:open    endifendffunction ClosePair(char)    if getline('.')[col('.') - 1] == a:char        return "\<Right>"    else        return a:char    endifendffunction AutoBracket()    "只对两者情况补全,一是光标在行末,二是光标下一个字符是空格    let line = getline('.')    if col('.') > strlen(line) || line[col('.') - 1] == ' '        return "{\<CR>}\<Esc>O\<Tab>"    else        return "{"    endifendffunction CloseBracket()    "只对两者情况补全,一是光标在行末,二是光标下一个字符是空格    let line = getline('.')    if col('.') <= strlen(line) && line[col('.') - 1] != ' '        return "}"    endif    if match(getline(line('.') + 1), '\s*}') < 0        return "\<CR>}"    else        return "\<Esc>j0f}a"    endifendffunction QuoteDelim(char)    "只对两者情况补全,一是光标在行末,二是光标下一个字符是空格    let line = getline('.')    if col('.') <= strlen(line) && line[col('.') - 1] != ' ' && line[col('.') - 1] != a:char        return a:char    endif    let line = getline('.')    let col = col('.')    if line[col - 2] == "\\"        "Inserting a quoted quotation mark into the string        return a:char    elseif line[col - 1] == a:char        "Escaping out of the string        return "\<Right>"    else        "Starting a string        return a:char.a:char."\<Esc>i"    endifendf "use for tagListlet Tlist_Show_One_File=1let Tlist_Exit_OnlyWindow=1
~/.vim/syntax/c.vim文件如下(没有~/.vim/syntax目录的则新建一个):
"========================================================" Highlight All Function"========================================================"highlight Functionssyn match cFunctions "\<[a-zA-Z_][a-zA-Z_0-9]*\>[^()]*)("me=e-2syn match cFunctions "\<[a-zA-Z_][a-zA-Z_0-9]*\>\s*("me=e-1hi cFunctions gui=NONE cterm=bold  ctermfg=blue guifg=#B5A1FF"========================================================" Highlight All Math Operator"========================================================" C math operatorssyn match       cMathOperator     display "[-+*\/%=]"" C pointer operatorssyn match       cPointerOperator  display "->\|\."" C logical   operators - boolean resultssyn match       cLogicalOperator  display "[!<>]=\="syn match       cLogicalOperator  display "=="" C bit operatorssyn match       cBinaryOperator   display "\(&\||\|\^\|<<\|>>\)=\="syn match       cBinaryOperator   display "\~"syn match       cBinaryOperatorError display "\~="" More C logical operators - highlight in preference to binarysyn match       cLogicalOperator  display "&&\|||"syn match       cLogicalOperatorError display "\(&&\|||\)="" Math Operatorhi cMathOperator            ctermfg=2  guifg=#3EFFE2hi cPointerOperator         ctermfg=2  guifg=#3EFFE2hi cLogicalOperator         ctermfg=2  guifg=#3EFFE2hi cBinaryOperator          ctermfg=2  guifg=#3EFFE2hi cBinaryOperatorError     ctermfg=2  guifg=#3EFFE2hi cLogicalOperator         ctermfg=2  guifg=#3EFFE2hi cLogicalOperatorError    ctermfg=2  guifg=#3EFFE2
常用命令如下:
%跳转到配对的括号去[[跳转到代码块的开头去(但要求代码块中'{'必须单独占一行)gD跳转到局部变量的定义处''跳转到光标上次停靠的地方, 是两个', 而不是一个"mx设置书签,x只能是a-z的26个字母`x跳转到书签处("`"是1左边的键)>增加缩进,"x>"表示增加以下x行的缩进<减少缩进,"x<"表示减少以下x行的缩进gg=G格式化全文件的代码==格式化本行代码,前面可以加数字表示格式化N行代码<C-]>【ctags命令】转到光标所在函数或者变量的定义处<C-T>【ctags命令】回到跳转前的代码处(适用于任何跳转)
ctags应用:
1. linux自带版本可能比较低,可以去http://ctags.sourceforge.net更新。
2. 在自己源码的最上层目录下运行命令: ‘ctags -R’,此时在当前目录下会生成一个 tags 文件
3. 如果源码不是在同一层目录,需要打开任一个文件,执行‘:set tags=/home/work/project/tags’命令选择使用你刚才生成的tags文件(如果需要经常使用该项目,你也可以将该命令添加到~/.vimrc中去);如果代码都是同一层目录,tags文件也生成在该目录下,则没有必要,因为ctags命令会自动使用当前目录下tags文件。
4. 修改程序后, 比如增加了函数定义, 删除了变量定义, tags文件不能自动rebuild, 你必须手动再运行一下命令‘ctags -R’
5. 就可以执行常用命令里的【ctags命令】了

TagList插件:
1. 首先需要去http://www.vim.org/scripts/script.php?script_id=273页面下载该插件,并解压在~/.vim目录下(没有该目录则新建一个)。
2. 该插件会在.vim目录下的两个子目录中添加自己的数据:doc/taglist.txt和plugin/taglist.vim,前者是详细的帮助文档,可以在vi中使用':help taglist.txt'命令查看,使用help命令时会自动去~/.vim/doc目录下查找同名文件。
3. 在~/.vimrc中添加语句,如上面的.vimrc文件中的注释部分
4. 在vim使用':Tlist'命令打开Symbol窗口;使用ctl-w+w或ctl-w+ 方向键进行窗口切换;

2. 其他

一般用gcc编译生成的执行文件已经具有执行属性,如果没有就使用chmod a+rx a.out 来为其加上执行属性。

执行时需要使用./a.out形式,否则会去PATH路径里寻找可执行文件。


5.系统调用

常常用到的一些C语言函数就是对系统调用进行了一些封装和扩展后为用户提供的更安全,更可靠的接口.可用在linux内核源代码中找到所有系统调用的声明,也可以通过命令man 2 syscalls 来查看它们的详细资料.
系统调用使用<unistd.h>中的宏_syscallN(type,name,参数表),N=0-6,指明参数的个数,参数表形式为typeN,argN.但是C语言函数库对大部分系统调用都有实现,所以一般不用直接调用这几个宏.
常用头文件:
<sys/types.h>
<sys/stat.h>

<sys/file.h>
flock 锁定或解锁文件

<fcntl.h>
fcntl 操作文件描述符
open 打开指定路径的文件,成功后返回文件描述符
creat 创建一个文件
close 关闭文件

<unistd.h>
read 读取文件.readv将文件中的数据读到缓冲数组
write 写入文件.wirtev将缓冲数组中的数据写入文件
lseek 移动读写指针
access 检查文件是否可以读写
stat 获取文件状态
fstat 同stat,输入参数不一样
lstat 同stat,但对链接文件只返回该链接本身的状态
dup 复制文件描述符.dup2复制文件描述符后关闭原来的文件描述符
mkdir 创建目录
chdir 改变当前工作目录
rmdir 删除指定目录
chmod 改变文件权限
chown 改变文件所有者
readlink 读取链接文件
symlink 建立一个新的链接到指定文件
unlink 删除已经建立的链接
link 建立一个链接到指定文件
pipe 创建管道文件
getpid 获得当前进程的ID
getppid 获得父进程的ID
getuid 获得当前进程的所有者的ID
geteuid 获得当前进程的有效用户ID
getgid 获得当前进程的所属组的ID
getegid 获得当前进程的有效组的ID
fork 创建一个进程,继承当前进程属性
nice 改变进程优先级
execl 使用完整程序路径和参数来创建一个新进程.execlp,execle,execv,execvp都是一样功能,但输入参数不同
sleep 使进程睡眠一段时间
gettimeofday 得到目前时间
settimeofday 设置目前时间

<dirent.h>
readdir 得到一个目录的进入点
opendir 打开指定的目录文件
rewinddir 设置目录文件的读写指针退回到原来开头的读取位置
telldir 返回目录文件的读写指针位置
seekdir 设置目录文件的读写指针位置
closedir 关闭不再使用的目录文件

<wait.h>
wait 阻塞父进程直到有任一个子进程结束
waitpid 阻塞父进程来等待指定的子进程,直到子进程结束

<signal.h>
signal 添加回调函数来捕获信号

<utime.h>
utime 修改文件所属的inode存取时间

<pthread.h>
pthread_create 创建一个线程
pthread_exit 用于退出线程
pthread_join 挂起当前进程来等待指定的线程,直到该线程被提前终止
pthread_mutex_init 初始化互斥锁
pthread_mutex_destroy 释放一个互斥锁
pthread_mutex_lock 加锁
pthread_mutex_unlock 解锁
pthread_mutex_trylock 尝试加锁
pthread_cond_init 创建条件对象
pthread_cond_destroy 注销一个条件对象
pthread_cond_wait 等待一个条件对象
pthread_cond_timedwait 等待一个条件对象,时间到时返回

<syslog.h>
openlog 打开日志文件
syslog 写入日志文件
closelog 关闭日志文件

<dlfcn.h>
dlopen 打开指定名字的动态链接库
dlerror 当动态链接库操作函数执行失败时返回出错信息
dlsym 根据动态链接库操作句柄与符号,返回符号对应函数的执行代码地址
dlclose 关闭指定句柄的动态链接库,当此动态链接库的使用计数为0时才会真正被系统卸载





























































原创粉丝点击