最近编译一个项目的程序时,二十几个源代码文件放在六个文件夹中,而且各个文件中头文件互相包含。以前写过编译这样组织的源码的makefile,所以这次也就直接写了。

确实因为各个文件间的头文件互相包含,造成在第一次写完后,make时出现了很多未定义。于是把各个文件的头文件重新检查一边,同时载makefile中尽量按照相对路径,把所有的头文件都包含进来。终于在忙活了三个小时后,一个可以在自己机器上编译的makefile写好了。(仅指在自己的机器上,因为有一个库文件使用的是我电脑上的绝对路径)

果然,在拿到同事的机器上编译时,因为我们的库文件安装的路径不一样,编译时找不到库文件出问题了。于是不得不在他的电脑上重新该库的路径,由于在每个文件夹下都有makefile,而且大部分都和这个库有关系,所以又改了不少时间。于是每次我们交换文件时,都要改变一次库文件的路径。就感觉麻烦。正好这个时候,看到了automake和autoconf,可以使用他们来自动生成makefile,只要在配置configure时,修改参数就可以。于是决定试试它。

开始时很顺利,一次编译就成功了。(从http://www.gnu.org/software/autoconf/下载automake和autoconf)

但是后来交叉编译时,出问题了。还是库的原因,因为自己载PC 上装的是默认路径,没有问题,但是交叉编译的库的路径不在默认路径下,结果怎么也编译通不过。后来找到原因了,因为自己以前编译sqlite3库的时候,可能将交叉编译链的名称写错了,结果编译出的库不是arm-linux-gcc4.2的,还是pc的GCC。

之所以想到这里是因为之前在编译时最后几行会有这样的提示 /usr/bin/ld: skipping incompatible /home/tt/Public/sql-arm-lib/lib/libsqlite3.a when searching for -lsqlite3才想到可能是自己的库出问题了,以前也遇到过,但是已是很早已前的事情了。没想到同样的问题,现在又出现了。

找到问题后,今天晚上重新编译了以下sqlite3库,使用arm-none-linux-guneabi-gcc

然后在重新编译,make通过了。

在这里重复一点就是如果是要在configure时,从外部输入路径(即载写Makefile.am时,用到@@修饰中间的参数时),在修改configure.in需要对相应的参数加上AC_SUBST()宏,如果不加则路径添加不进去。自己在编译时是这样的,不知道有没有更好地办法。

这里想到其实在configure时可以使用脚本来控制,这样就更方便了。好像makefile.am也可以那脚本来生成,不过自己还没有去查。

05-02 15:50