星期一, 三月 24, 2014

gnumake 如何检测系统,使用不同的设置?

最简单语法,利用系统隐含变量OS 来做判断:

ifeq (Windows,$(findstring Windows,$(OS)))LINKFLAG=
endif

不过变量OS 不见于任何文档,如何发现gnumake定义的所有的内置隐含variables?
GNU make provides .VARIABLES which holds all global variables' names
简单的Makefile语句打印出所有的定义的内置变量可以发现OS赫然其中了:

VARS_OLD = $(.VARIABLES)
$(foreach v,$(VARS_OLD),$(info $(v)))

星期六, 三月 22, 2014

Ubuntu 13.10 如何使用sqlite3 shared library。

1.下载最新代码www.sqlite.org
2.建立Makefile文件:
CFLAG= -fPIC -std=c99

libsqlite3.so:sqlite3.c
gcc $(CFLAG)     -shared -lpthread -c   -o libsqlite3.so sqlite3.c

all :  libsqlite3.so db.o pattern.o testPattern.o
gcc   -o test.exe db.o pattern.o testPattern.o libsqlite3.so -ldl -lpthread

开始编译时总是出现"undefined reference sqlite3_open",
当然有经验的自然知道是gcc link库的顺序的调整问题了。
所以开始使用-L. -lsqlite3 依然无法解决问题。
这头大了,最后发现关键在于,将两个-ldl -lpthread放在最后就可以解决问题。
可以理解,unix 下link的顺序同引用的函数次序相关,越是最基本或者
最底层的越要放在最后.
所以上述的最后编译命令修改为标准规范的well-formatted也是可以的
gcc   -o test.exe db.o pattern.o testPattern.o -L. -lsqlite3 -ldl -lpthread