Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在windows中创建包含子目录的makefile时,%wildcard停止工作_Windows_Makefile_Wildcard_Subdirectory - Fatal编程技术网

在windows中创建包含子目录的makefile时,%wildcard停止工作

在windows中创建包含子目录的makefile时,%wildcard停止工作,windows,makefile,wildcard,subdirectory,Windows,Makefile,Wildcard,Subdirectory,这是关于此处的第二个响应: 除了调用make规则外,这个解决方案对我来说非常有效。由于构建目录中还不存在这些文件,因此它们似乎从来不会在调用一次make目标时进行任何更改。我通过在build目录(只是anyting.o)中创建空文件来测试这一点,然后找到make规则 我的结论是%通配符只查找目录中的内容,找不到该文件,因此它没有为该文件制定生成规则,因此无法继续。有两种可能的解决方案: 1) 找到一种方法,使虚拟对象文件在编译器实际启动时被覆盖 2) Make Make“意识到”通配符适用于放

这是关于此处的第二个响应:

除了调用make规则外,这个解决方案对我来说非常有效。由于构建目录中还不存在这些文件,因此它们似乎从来不会在调用一次make目标时进行任何更改。我通过在build目录(只是anyting.o)中创建空文件来测试这一点,然后找到make规则

我的结论是%通配符只查找目录中的内容,找不到该文件,因此它没有为该文件制定生成规则,因此无法继续。有两种可能的解决方案:

1) 找到一种方法,使虚拟对象文件在编译器实际启动时被覆盖

2) Make 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))))