问题:
obj-y 或者 xxx-objs 可以一次性手动赋值多个,比如
obj-y += aaa.o bbb.o ccc.o ddd.o
xxx-objs += aaa.o bbb.o ccc.o ddd.o
执行 make 可以正常编译
但是:
我如果想用一个变量来自动查找 Makefie 所在目录的所有 .c 文件,将其转换成 .o 字符串添加到 obj-y 或 xxx-objs 字段,如下:
SRCS := $(wildcard *.c)
OBJS := $(foreach f,$(SRCS),$(f:%.c=%.o))
obj-y += $(OBJS)
却完全不能用,我检查过 obj-y 确实是被赋值了的,但事实就是没法编译出对应的 .c 文件。
!!!有没有办法可以给 obj-y 赋成一个变化的值??
时隔几个月,还是在看Makefile官方的手册时找到方法。现在自问自答了。
在内核模块的makefile里面使用**$(wildcard *.c)**无法编译的原因是工作目录变了,即,make -C /xxxx 改变了工作目录,所以$(wildcard *.c)获取的是改变的工作目录下面的C文件,这当然找不到了。
正确的写法是这样
MODULE_NAME += module0
CURD := $(dir $(abspath $(lastword $(MAKEFILE_LIST))))
SRCS := $(shell cd $(CURD) && ls -f *.c 2>/dev/null |grep -v .mod.c|xargs)
OBJS := $(subst .c,.o,$(SRCS))
obj-m += _$(MODULE_NAME).o
_$(MODULE_NAME)-objs += $(OBJS)
makefile,参考如下,如有帮助,请采纳一下,谢谢。
#编译器LINUX
CXX=g++
#编译动态库
CXXDL= -g -lpthread $(LIB)
COMPILE=-c -g
#编译目标文件
CXXFLAGS=-g $(INCLUDE) -fPIC
#头文件搜索路径
INCLUDE=-I./ -I/data/zh/include
#动态库
LIB=-L/data/zh/lib -lnettrans -L/data/zh/lib/proTest -lLcLog
#目标文件
OBJ_FILES=MainDispMsg.o CommonTools.o MyPriorityQueue.o
#可执行文件
TARGET=./MsgDisp10
$(TARGET):$(OBJ_FILES)
@echo "Link the $@ starting..."
$(CXX) -o $(TARGET) $(OBJ_FILES) $(CXXDL)
@echo "Link the $@ done."
$OBJ_FILES:%.o:%.cpp
$(CXX) $< -o $@ $(COMPILE) -I$./
clean:
rm $(OBJ_FILES) $(TARGET)