事件的两个主角:
1、库:liblinear
2、程序:sceadan(依赖liblinear)
操作流程:
1、进入train.c和predict.c 所在文件夹 cd /home/ly/Downloads/liblinear-1.94 //文件夹中有Makefile,因此不需要./configure
2、ly@master:/home/ly/Downloads/liblinear-1.94#make //编译成功
3、ly@master:/home/ly/Downloads/liblinear-1.94#make install
***没有规则可以创建目标 install。停止。//原因是Makefile中并没有写入install命令。intall实际上就是将可执行文件复制到/usr/local/bin,这种安排,个人感觉就是为了便于管理。详细关于如何安装源码程序的方法,参见鸟哥基础学习第三版P677
4、ly@master:/home/ly/Downloads/liblinear-1.94#./train heart_scale //执行成功,在liblinear-1.91文件中也可以注意到名称为train的可执行文件(可惜linux文件不能通过后缀知道某文件是否是可执行文件)
5、解压sceadan.v1.tar.bzip2.out: tar -xvf sceadan.tar.bzip2.out(解压得到文件夹extracted pkg3,因为,cd命令似乎不支持包含空格命名的文件夹,于是将文件夹命名为extracted_pkg3)
6、root@master:/home/ly/Downloads/extracted_pkg3# make
rm sceadan *.o ucv* bcv* main* *~||:
rm:无法删除“sceadan”:没有那个文件或者目录
rm:无法删除“*.o”:没有那个文件或者目录
rm:无法删除“ucv*”:没有那个文件或者目录
rm:无法删除“bcv*”:没有那个文件或者目录
rm:无法删除“main*”:没有那个文件或者目录
rm:无法删除“*~”:没有那个文件或者目录
...
predict.c:8:20 致命错误:linear.h:没有发现那个文件或者目录
编译中断
make:***[sceadan]错误1
问题解决
1、查看liblinear的Makefile,发现有
lib:linear.o tron.o blas/blas.a
...
$(CXX) $${SHARED_LIB_FLAG} linear.o tron.o blas/blas.a -o liblinear.so.$(SHVER) //将宏定义部分(含$的部分)根据Makefile的预定义替换掉,发现该语句的作用是生成动态库
但是,执行make指令后,文件夹中并没有生成任何.so文件(为什么没有生成,我也没明白),表明该语句没有执行。于是,在shell或者终端中,手动生成.so文件(操作方法就是,将宏定义替换后的g++生成.so文件在命令行中输入一次)。
2、回到extracted_pkg3文件夹中,执行make,发现报错”/usr/bin/ld:cannot find -linear“//表明,执行sceadan的makefile时,在/usr/bin期待找到liblinear的库,但没有找到。将liblinear.so.1拷贝到该文件夹中。再次执行,即可。
一点个人想法
出了问题,解决办法就是见招拆招,各种鬼马的想法都可以试试。那些自以为一定正确的步骤,未必正确。