在windows中创建包含子目录的makefile时,%wildcard停止工作
这是关于此处的第二个响应: 除了调用make规则外,这个解决方案对我来说非常有效。由于构建目录中还不存在这些文件,因此它们似乎从来不会在调用一次make目标时进行任何更改。我通过在build目录(只是anyting.o)中创建空文件来测试这一点,然后找到make规则 我的结论是%通配符只查找目录中的内容,找不到该文件,因此它没有为该文件制定生成规则,因此无法继续。有两种可能的解决方案: 1) 找到一种方法,使虚拟对象文件在编译器实际启动时被覆盖 2) Make Make“意识到”通配符适用于放入Make目标函数的任何内容,而不是目录中已有的内容 有什么建议吗 据我所知,我是第一个有这个问题的人 \在windows中创建包含子目录的makefile时,%wildcard停止工作,windows,makefile,wildcard,subdirectory,Windows,Makefile,Wildcard,Subdirectory,这是关于此处的第二个响应: 除了调用make规则外,这个解决方案对我来说非常有效。由于构建目录中还不存在这些文件,因此它们似乎从来不会在调用一次make目标时进行任何更改。我通过在build目录(只是anyting.o)中创建空文件来测试这一点,然后找到make规则 我的结论是%通配符只查找目录中的内容,找不到该文件,因此它没有为该文件制定生成规则,因此无法继续。有两种可能的解决方案: 1) 找到一种方法,使虚拟对象文件在编译器实际启动时被覆盖 2) Make Make“意识到”通配符适用于放
模块:=校准/设置摄像头/尼康摄像头ommon
SRC_DIR:=$(addprefix SRC/,$(MODULES))SRC
SDK_INCLUDES:=include$(addprefix include/,$(MODULES))
BUILD_DIR:=BUILD$(addprefix BUILD/,$(MODULES))
SRC:=$(foreach sdir,$(SRC_DIR),$(通配符$(sdir)/*.cpp))
对象:=$(patsubst src/%.cpp,build/%.o,$(src))
#OpenCV目录,根据您自己的安装进行更改
CV\u INCLUDE\u DIR=C:\Users\a0225122\Downloads\opencv\build\INCLUDE
CV\u LIB\u DIR=C:\Users\a0225122\Downloads\opencv\bin\LIB
CV_LIBS=-llibopencv_core249\
-利波彭斯沃高圭249\
-利波彭斯大学imgproc249\
-llibopencv_特征249\
-llibopencv_Calib249
CV_标志=-I$(CV_包含_目录)-L$(CV_LIB_目录)$(CV_LIBS)
HID_API_INCLUDE_DIR:=第三方/hidapi主机/hidapi/HID.h
#编译指令
CXXFLAGS=-std=c++11-Wall-I$(SDK\u INCLUDE\u DIR)-I$(CV\u INCLUDE\u DIR)-I$(HID\u API\u INCLUDE\u DIR)-L$(CV\u LIBS)-L$(FLYCAP\u LIB\u DIR)$(FLYCAP\u LIBS)
#清洁说明
ifdef SystemRoot#这是windows
CXX=mingw32-g++
RM=del/Q
FixPath=$(subst/,\,$1)
BUILD\u DIR:=$(调用FixPath,$(BUILD\u DIR))
SRC_DIR:=$(调用FixPath,$(SRC_DIR))
SDK\u包含:=$(调用FixPath,$(SDK\u包含))
SRC:=$(调用FixPath,$(SRC))
OBJ:=$(调用固定路径,$(OBJ))
CXXFLAGS:=$(调用固定路径,$(CV_标志))
制定目标
$1\%o:%cpp
$(CXX)$(CXXFLAGS)-c$$<-o$$@
恩德夫
否则,可以为更多操作系统添加更多的IFEQ,但这应该没问题
CXX=g++
RM=RM-f
制定目标
$(1)/%.o:%.cpp
$(CXX)$(CXXFLAGS)-c$$<-o$$@
恩德夫
恩迪夫
vpath%.cpp$(SRC\u目录)
SDK_LIBS=lib_core.a
默认值:SDK.exe
.假冒:干净
清洁:
$(RM)构建*.a
#可执行文件生成
SDK.exe:$(SDK_LIBS)
$(CXX)$(CXXFLAGS)$^-o$@
lib_core.a:checkdirs$(OBJ)
ar rcs lib_core.a$(OBJ)
checkdirs:$(生成目录)
$(构建目录):
mkdir$@
#$(OBJ):$(SRC)
#$(CXX)$(CXXFLAGS)-c$^-o$@
$(foreach bdir,$(BUILD_DIR),$(eval$(call make goal,$(bdir)))
您的第一个问题是,在GNU make规则中不能使用反斜杠,但在recipes中除外(make只是将配方发送到shell,它不会解释配方,除了$
)。所有GNU make目标、先决条件等必须始终使用前斜杠,即使在Windows上也是如此
几乎所有Windows应用程序都会正确地接受正斜杠作为目录分隔符。对于少数不需要的函数,可以使用函数FixPath
,但必须在配方中使用,而不是在目标或先决条件列表中使用
一旦你解决了这个问题,如果你仍然有问题,发布你的问题,我们会查看。但是,你的结论是不正确的。Make不扫描目录中与模式匹配的目标。相反,如果您要求构建一个与模式匹配的目标,那么它将尝试通过创建先决条件来查看是否可以使用模式规则。如果可以,则使用模式规则。如果没有,它就不会使用它。你的描述不够清楚,我们无法提供帮助。请提供您失败的示例makefile的剪切/粘贴、您运行的命令行,以及(剪切/粘贴)您得到的输出和您想要得到的。我已经添加了我的代码,对此表示抱歉
MODULES := calibration calibration/settings camera/nikon camera ommon
SRC_DIR := $(addprefix src/, $(MODULES)) src
SDK_INCLUDES := include $(addprefix include/, $(MODULES))
BUILD_DIR := build $(addprefix build/, $(MODULES))
SRC := $(foreach sdir,$(SRC_DIR),$(wildcard $(sdir)/*.cpp))
OBJ := $(patsubst src/%.cpp,build/%.o, $(SRC))
# OpenCV directories, change according to your own installation
CV_INCLUDE_DIR = C:\Users\a0225122\Downloads\opencv\build\include
CV_LIB_DIR = C:\Users\a0225122\Downloads\opencv\bin\lib
CV_LIBS = -llibopencv_core249 \
-llibopencv_highgui249 \
-llibopencv_imgproc249 \
-llibopencv_features2d249 \
-llibopencv_calib3d249
CV_FLAGS = -I$(CV_INCLUDE_DIR) -L$(CV_LIB_DIR) $(CV_LIBS)
HID_API_INCLUDE_DIR := 3rd_party/hidapi-master/hidapi/hid.h
# Compiler instructions
CXXFLAGS = -std=c++11 -Wall -I $(SDK_INCLUDE_DIR) -I $(CV_INCLUDE_DIR) -I $(HID_API_INCLUDE_DIR) -L $(CV_LIB_DIR) $(CV_LIBS) -L $(FLYCAP_LIB_DIR) $(FLYCAP_LIBS)
# Clean up instructions
ifdef SystemRoot #This is windows
CXX = mingw32-g++
RM = del /Q
FixPath = $(subst /,\,$1)
BUILD_DIR := $(call FixPath, $(BUILD_DIR))
SRC_DIR := $(call FixPath, $(SRC_DIR))
SDK_INCLUDES := $(call FixPath, $(SDK_INCLUDES))
SRC := $(call FixPath, $(SRC))
OBJ := $(call FixPath, $(OBJ))
CXXFLAGS := $(call FixPath, $(CV_FLAGS))
define make-goal
$1\%.o: %.cpp
$(CXX) $(CXXFLAGS) -c $$< -o $$@
endef
else #more ifeqs can be added for more OS's but this should be fine
CXX = g++
RM = rm -f
define make-goal
$(1)/%.o: %.cpp
$(CXX) $(CXXFLAGS) -c $$< -o $$@
endef
endif
vpath %.cpp $(SRC_DIR)
SDK_LIBS = lib_core.a
default: SDK.exe
.PHONY: clean
clean:
$(RM) build *.a
#executable generation
SDK.exe: $(SDK_LIBS)
$(CXX) $(CXXFLAGS) $^ -o $@
lib_core.a: checkdirs $(OBJ)
ar rcs lib_core.a $(OBJ)
checkdirs: $(BUILD_DIR)
$(BUILD_DIR):
mkdir $@
#$(OBJ): $(SRC)
# $(CXX) $(CXXFLAGS) -c $^ -o $@
$(foreach bdir,$(BUILD_DIR),$(eval $(call make-goal,$(bdir))))