今天在使用 make 编译 luafilesystem出现了以下问题

1
make: Nothing to be done for 'lib'.

意思就是 make 没有执行任何编译操作,它可能认为所有目标文件都已经是最新的了

这个问题一般有两个原因引起

  1. 已经是最新的了: make 会根据源文件和目标文件的时间戳来决定是否需要重新编译
  2. Makefile 配置问题: Makefile 中的编译规则可能没有正确处理 CFLAGS 或没有正确指定编译目标

解决方法

1. 强制重新编译

最简单的办法就是清理旧的编译文件,然后重新编译

1
2
make clean
make CFLAGS="-I/usr/local/openresty/luajit/include/luajit-2.1 -fPIC"

make clean 会删除已经编译的文件( .o.so 文件),然后再执行 make,重新编译。

2. 检查 Makefile 配置

如果执行 make clean 后问题还是有问题,那有可能就是是 Makefile 中的配置存在问题,导致 make 没有正确地识别到需要编译的文件

查看 Makefile 中的编译规则,确保 CFLAGS 被正确传递给编译器

1
CFLAGS += -fPIC

确认编译规则为以下内容

1
2
src/lfs.o: src/lfs.c
gcc $(CFLAGS) -c src/lfs.c -o src/lfs.o

这样,gcc 会用 CFLAGS 中的选项进行编译,如果 Makefile 配置有问题的话就可能无法识别出需要重新编译的文件

3. 手动编译源文件

如果上面两种方法都没用,可以尝试手动编译源文件,确认编译器是否能够正确地生成 .o文件,链接成共享库 .so

编译源文件:

1
gcc -I/usr/local/openresty/luajit/include/luajit-2.1 -fPIC -c src/lfs.c -o src/lfs.o

如果没问题就将 .o 文件链接为 .so 文件即可

1
gcc -shared -o src/lfs.so src/lfs.o