Category Archives: linux

在老版本gcc下编译numpy

去年在装numpy的时候其实就遇到了这个问题,今年有同学又提出来,已经没有印象了,又重新摸索了一遍才又记了起来。

Posted in linux, machine learning | Tagged , , | Leave a comment

linux下etc文件夹的含义

今天忽然想到一个问题,我们一般都知道usr文件夹是user的缩写,sys文件夹是system的缩写,dev文件夹是device的缩写……那么/etc文件夹是什么的缩写呢?

Posted in linux | Tagged | 2 Comments

如何让GCC检查类printf函数的参数

来篇又短又水的。 大家都知道在c语言中有一类可变参数(variable-argument)的函数,像printf、scanf,这类函数的一大优势是输入参数的数量和类型都可以自由控制,但是问题也很明显,如果可变参数输入的个数或者类型不对,正常情况下编译器检查不出这样的错误,而实际运行却可能破坏堆栈,导致一些古怪的运行结果,很难定位到问题。   gcc中使用__attribute__format 可以解决这个问题。该__attribute__属性可以给被声明的函数加上类似printf或者scanf的特征,从而使编译器检查函数声明和函数实际调用参数之间的格式化字符串是否匹配。该功能十分有用,尤其是处理一些很难发现的bug。 format的语法格式为: format (archetype, string-index, first-to-check) format属性告诉编译器,按照printf, scanf, strftime或strfmon的参数表格式规则对该函数的参数进行检查。“archetype”指定是哪种风格;“string-index”指定传入函数的第几个参数是格式化字符串;“first-to-check”指定从函数的第几个参数开始按上述规则进行检查。 具体使用格式如下: __attribute__((format(printf,m,n))) __attribute__((format(scanf,m,n))) 其中参数m与n的含义为: m:第几个参数为格式化字符串(format string); n:参数集合中的第一个,即参数“…”里的第一个参数在函数参数总数排在第几,注意,如果是在类成员函数中使用,还要考虑到隐藏的this指针。   举个例子: 1: 2:extern void myprint(const char *format,…) __attribute__((format(printf,1,2))); 3: 4:void test() 5:{ 6:     myprint(“i=%d\n”,6); 7:     myprint(“i=%s\n”,6); 8:     myprint(“i=%s\n”,”abc”); 9:     … Continue reading

Posted in linux | Tagged , , , , | Leave a comment

(小tip)grep中坑爹的正则表达式

今天上午被grep中的正则表达式坑了半天,今晚就小结一下吧。 1、在grep和sed中,\t和\s都是无效的,要表示制表符和空格,只能直接敲入tab和空格键,这个在shell脚本中还好说,在命令行模式下就比较麻烦了,因为tab默认是会智能补全命令的,所以要在按tab之前按下ctrl+v,就可以把tab打出来了。 2、egrep和grep -E是等效的,egrep相比grep对正则表达式有了一些扩展支持,具体包括一下几点(其实这些特性grep是可以用的,只不过要在元字符前面加上转义符,比如用到+时,应敲入\+): +:匹配一个或多个先前的字符。如:'[a-z]+able’,匹配一个或多个小写字母后跟able的串,如loveable,enable,disable等。 ?:匹配零个或多个先前的字符。如:’gr?p’匹配gr后跟一个或没有字符,然后是p的行。 a|b|c :匹配a或b或c。如:grep|sed匹配grep或sed ():分组符号,如:love(able|rs)ov+匹配loveable或lovers,匹配一个或多个v。 x{m},x{m,},x{m,n}:作用同x\{m\},x\{m,\},x\{m,n\} 3、grep还支持一些POSIX字符类,也一并记录如下吧,虽然平时应该不大可能用到: [:alnum:]:文字数字字符 [:alpha:]:文字字符 [:digit:]:数字字符 [:graph:]:非空字符(非空格、控制字符) [:lower:]:小写字符 [:cntrl:]:控制字符 [:print:]:非空字符(包括空格) [:punct:]:标点符号 [:space:]:所有空白字符(新行,空格,制表符) [:upper:]:大写字符 [:xdigit:]:十六进制数字(0-9,a-f,A-F) 这篇文章主要参考了一篇博文(不过原出处就不知道是哪了,反正遵守GPL协议……要是一开始就看到这篇文章,也许就不会白白浪费一个上午了=_=

Posted in linux | Tagged | 1 Comment

Makefile小摘要

来点圡的。 makefile这种东西也熟能生巧的东西。网上的资料很多很全了,这篇就算自己整理的一些小tip, 如果已经很熟悉makefile的可以直接忽略。 网上和参考书的资料多是详细罗列各种语法规则,要么勿尽齐全,以致冗繁(这点和linux里面的man手册有点像,虽然手册写得大而全无可厚非,但是读起来总是很费时费力,效率不高),要么只捡要点,拾一漏万。本文直接用一个现成的MAKEFILE文件添加注释的方式进行说明,力求能覆盖makefile编写过程中的一些基本要点。 include Makefile.env #makefile中include的用法和c语言中类似,只不过不用加””或<>,实际使用中可以用类似Makefile.env之类的文件来定义一些常用的可移植的宏定义来增加makefile的可重用性 SRC_PATH=./src INC_PATH=./inc PWD=./ #以上类似于C语言中的宏定义,只不过不用加#define,或者也可以视为变量定义,其实就是shell中的语法 INCLUDES =  -I $(CONFIG)/include \ -I $(TEST)test_log/ \ -I $(BUFFER)include \ LDFLAGS = -L $(CONFIG)/lib -lconfig \ -L $(TEST)/test_log/ -ltest_log \ -L $(BUFFER)lib/ -lullib\ CFLAGS = -Wall -W -pipe … Continue reading

Posted in linux | Tagged | Leave a comment