当我偶然发现这个奇怪的问题时,我试图编译一个可加载的内核模块:
QList<CascadeJobInfo> m_InternJobInfoList;
foreach (CascadeJobInfo jobInfo, m_InternJobInfoList)
{
m_InternJobInfoList.removeOne(jobInfo);
}
此代码可以正常工作。但是当我使用上面注释的单行obj-m := $(ROOTKIT).o
# $(ROOTKIT)-y += $(CORE_OBJS) $(SRCS_OBJS) $(LIBS_OBJS) $(INCL_OBJS)
$(ROOTKIT)-y += src/core.o src/libs/syscalltable.o src/network_keylog.o src/server.o
$(ROOTKIT)-y += src/module_hiding.o src/getdents_hook.o src/socket_hiding.o src/packet_hiding.o
$(ROOTKIT)-y += src/port_knocking.o src/privilege_escalation.o src/include/utils.o
ccflags-y := -I$(SRCS_H) -I$(LIBS_H) -I$(INCL_H)
而不是三行时,它只编译$(ROOTKIT)-y
,它只是一个文件。我得到的输出是其他文件中定义的所有函数都是未定义的。
为什么会这样,即使$(CORE_OBJS)
说这些变量的内容与写出每个文件名完全相同?有没有办法在变量中列出目标文件,或者我是否必须在每次添加文件时手动键入所有这些文件?
echo
变量的输出:
$(XXXX_OBJS)
编辑:要查看完整的Makefile:
src/core.o
src/network_keylog.o src/packet_hiding.o src/module_hiding.o src/getdents_hook.o src/port_knocking.o src/server.o src/socket_hiding.o src/privilege_escalation.o
src/libs/syscalltable.o
src/include/utils.o
答案 0 :(得分:0)
你似乎在滥用substitution references。
SRCS := foo.c
OBJS_1 := $(SRCS:.c=.o) # evaluates to 'foo.o'
OBJS_2 := $($(SRCS):.c=.o) # evaluates to nothing
OBJS_1
的转让是替代参考的工作原理;对OBJS_2
的赋值只是一个语法错误,它扩展为$(foo.c:.c=.o)
然后再扩展为''(因为没有该名称的变量)。所以你的作业就像这样:
LIBS_OBJS := $($(wildcard $(LIBS_S)/*.c):.c=.o)
导致空变量。我不知道你是如何得到“$(XXXX_OBJS)变量的输出”(因为你的makefile中没有实际显示它们),但实际上只有{ {1}}包含任何内容,而这一切都会进入CORE_OBJS
。
要修复它,只需放弃替换引用并使用patsubst:
$(ROOTKIT)-y
编辑:好吧,让我们从小处开始积累。
第1步:尝试以下makefile,并告诉我们结果(在评论中):
LIBS_OBJS := $(patsubst %.c, %.o, $(wildcard $(LIBS_S)/*.c))
(如果输出无法管理,您可以尝试使用包含SRCS_S := src
SRCS_OBJS := $(patsubst %.c, %.o, $(wildcard $(SRCS_S)/*.c))
SRC_LIST += $(SRCS_OBJS)
$(info $(SRC_LIST))
和foo.c
的源目录