C++ 用于链接opencv.framework的Makefile(我不使用cmake)

C++ 用于链接opencv.framework的Makefile(我不使用cmake),c++,opencv,makefile,C++,Opencv,Makefile,我在项目中使用opencv,现在我使用makefile将项目编译成一个静态库,但总是输出“致命错误:'cv.h'未找到文件”。我已经搜索了这个网站和其他地方,这不是我需要的。我只知道一点makefile语法。我该怎么办 Makefile LIBS_DIR = ./lib/ OBJS_DIR = ./obj/ DEPENDENT_DIR = ./dependent/ HEADER_PATH = -I./include -I./implement -I. LIB_PATH = -L./lib S

我在项目中使用opencv,现在我使用makefile将项目编译成一个静态库,但总是输出“致命错误:'cv.h'未找到文件”。我已经搜索了这个网站和其他地方,这不是我需要的。我只知道一点makefile语法。我该怎么办

Makefile

LIBS_DIR = ./lib/
OBJS_DIR = ./obj/
DEPENDENT_DIR = ./dependent/

HEADER_PATH = -I./include -I./implement -I.
LIB_PATH = -L./lib

SRCDIRS := $(patsubst ./%, %, $(shell find . -type d))
SRCS_CXX := $(foreach dir, $(SRCDIRS), $(wildcard $(addprefix $(dir)\/*, .cpp)))

OBJS := $(SRCS_CXX:.cpp=.o)

%.o: %.cpp
  @echo "---------- .o begin ----------"
  $(CXX) -c $< $(HEADER_PATH)
  $(CXX) -o $@ $^ $(LIB_PATH)
  mv $@ $(OBJS_DIR)

%.d: %.cpp
  @echo "---------- dependent begin ----------"
  @set -e; \
  rm -f $@; \
  $(CXX) -MM $< > $@.tmp; \
  sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.tmp > $@; \
  rm -f $@.tmp
  mv $@ $(DEPENDENT_DIR)

-include $(DEPS)

.PHONY: clean

clean:
  rm -f obj/*.o lib/*.a dependent/*.d
  rm -rf SunWS_cache
#include <cv.h>
#include <cxcore.h>
#include <highgui.h>
LIBS\u DIR=。/lib/
OBJS_DIR=/obj/
相依的_DIR=/相依的/
标题\路径=-I./include-I./implement-I。
LIB_PATH=-L./LIB
SRCDIRS:=$(patsubst./%,%,$(shell find.-type d))
SRCS_CXX:=$(foreach dir,$(SRCDIRS),$(通配符$(addprefix$(dir)\/*,.cpp)))
OBJS:=$(SRCS_CXX:.cpp=.o)
%.o:%.cpp
@回音“-------------.o开始------”
$(CXX)-c$<$(标题路径)
$(CXX)-o$@$^$(库路径)
mv$@$(OBJS_目录)
%.d:%.cpp
@echo“------------相关开始----------------”
@set-e\
rm-f$@\
$(CXX)-MM$<>$@.tmp\
sed's,\($*\)\.o[:]*,\1.o$@:,g'<$@.tmp>$@\
rm-f$@.tmp
mv$@$(从属目录)
-包括美元(DEPS)
.假冒:干净
清洁:
rm-f obj/*.o lib/*.a dependent/*.d
rm-rf SunWS_缓存
在我的文件中

LIBS_DIR = ./lib/
OBJS_DIR = ./obj/
DEPENDENT_DIR = ./dependent/

HEADER_PATH = -I./include -I./implement -I.
LIB_PATH = -L./lib

SRCDIRS := $(patsubst ./%, %, $(shell find . -type d))
SRCS_CXX := $(foreach dir, $(SRCDIRS), $(wildcard $(addprefix $(dir)\/*, .cpp)))

OBJS := $(SRCS_CXX:.cpp=.o)

%.o: %.cpp
  @echo "---------- .o begin ----------"
  $(CXX) -c $< $(HEADER_PATH)
  $(CXX) -o $@ $^ $(LIB_PATH)
  mv $@ $(OBJS_DIR)

%.d: %.cpp
  @echo "---------- dependent begin ----------"
  @set -e; \
  rm -f $@; \
  $(CXX) -MM $< > $@.tmp; \
  sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.tmp > $@; \
  rm -f $@.tmp
  mv $@ $(DEPENDENT_DIR)

-include $(DEPS)

.PHONY: clean

clean:
  rm -f obj/*.o lib/*.a dependent/*.d
  rm -rf SunWS_cache
#include <cv.h>
#include <cxcore.h>
#include <highgui.h>
#包括
#包括
#包括

新错误

# The following is modified
SDK_PATH = ../sdk3
OPENCL_PATH = ../sdk3/opencl
OPENCV_PATH = ../sdk3/opencv3.0.0/include

vpath = %.h implement : %.h $(OPENCV_PATH) : %.h $(OPENCV_PATH)/opencv : %.h $(OPENCL_PATH) : %.h $(CALCTIME_PATH)

HEADER_PATH = \
-I. \
-I./implement \
-I$(OPENCV_PATH) \
-I$(OPENCV_PATH)/opencv \
-I$(OPENCV_PATH)/opencv2 \
-I$(OPENCL_PATH)/include/CL \

%.o: %.cpp
    @echo "---------- .o begin ----------"
    $(CXX) $(CXXFLAGS) -c $(HEADER_PATH) $< -o $@
    mv $@ $(OBJS_DIR)
我修改了
头路径
头路径=-I./include/opencv-I./include/opencv2-I./implement-I.
但是出现了一个新错误,
致命错误:“opencv2/core/core_c.h”文件未找到


我尝试添加一个新的子文件夹路径,如
-I./include/opencv-I./include/opencv2-I./include/opencv2/core-I./implement-I.
此错误仍在输出中,
-I
命令不会自动找到子文件夹的路径吗?我做错了什么吗?

您的头路径是
header\u PATH=-I./include-I./implement-I.

在附件中显示的
include
文件夹中,有两个子文件夹
opencv
opencv2

包含
cv.h时,直接包含
文件,而不包含子文件夹。
为了让编译器找到文件,您需要在
头文件路径
上添加子文件夹,比如
头文件路径=-I./include/opencv-I./include/opencv2-I./implement
或者您需要
#包括
,如果
cv.h
直接位于
opencv
子文件夹中


旁注:您在文件夹
denpendent

中有一个输入错误。最后,我解决了这个错误并成功编译,我仍然使用
CMake
。但是在我成功地使用
CMake
编译之后,我可以再次使用
Makefile
进行编译。“我认为这是我自己的错误,”佐梅克的回答帮助了我

这是我的CMakeLists.txt

cmake_minimum_required(VERSION 3.2)

project(library_name)

add_definitions(-Wall)

set(OPENCV_PATH ../sdk3/opencv3.0.0)
set(OPENCL_PATH ../sdk3/opencl)

link_directories(
    ${OPENCL_PATH}/bin
    ${OPENCV_PATH}
)
link_libraries(
    ${OPENCV_PATH}/opencv2.framework
    ${OPENCL_PATH}/bin/OpenCL.DLL
)

include_directories(
    ./
    ./implement
    ${OPENCV_PATH}/include
    ${OPENCV_PATH}/include/opencv
    ${OPENCL_PATH}/include/CL
)

set(SOURCES_FILES
    HS_Process.cpp
    implement/iclear/H_Proc.cpp
)

add_library(library_name STATIC ${SOURCES_FILES})

target_link_libraries(library_name opencv2 OpenCL)
在@zomeck的回答之后新建Makefile

# The following is modified
SDK_PATH = ../sdk3
OPENCL_PATH = ../sdk3/opencl
OPENCV_PATH = ../sdk3/opencv3.0.0/include

vpath = %.h implement : %.h $(OPENCV_PATH) : %.h $(OPENCV_PATH)/opencv : %.h $(OPENCL_PATH) : %.h $(CALCTIME_PATH)

HEADER_PATH = \
-I. \
-I./implement \
-I$(OPENCV_PATH) \
-I$(OPENCV_PATH)/opencv \
-I$(OPENCV_PATH)/opencv2 \
-I$(OPENCL_PATH)/include/CL \

%.o: %.cpp
    @echo "---------- .o begin ----------"
    $(CXX) $(CXXFLAGS) -c $(HEADER_PATH) $< -o $@
    mv $@ $(OBJS_DIR)
#以下内容已修改
SDK_路径=../sdk3
OPENCL_路径=../sdk3/OPENCL
OPENCV_PATH=../sdk3/opencv3.0.0/include
vpath=%.h实现:%.h$(OPENCV\u路径):%.h$(OPENCV\u路径)/OPENCV:%.h$(OPENCL\u路径):%.h$(计算时间路径)
标题路径=\
-一,\
-一、机具\
-I$(OPENCV_路径)\
-I$(OPENCV\u路径)/OPENCV\
-I$(OPENCV_路径)/opencv2\
-I$(OPENCL\u路径)/包含/CL\
%.o:%.cpp
@回音“-------------.o开始------”
$(CXX)$(CXXFLAGS)-c$(头路径)$<-o$@
mv$@$(OBJS_目录)

谢谢您的回复。这对我很有帮助,很抱歉把这个文件夹的名字拼错了。在我修改了
标题\u路径之后,出现了一个新问题。问题就在上面。
/include/opencv2
是一个相对路径。这些路径与您从中调用make的目录是相对的。在中,它们显示了一个根据调用make的文件夹更改路径的示例。您是对的,再次感谢。我解决了这个错误,可能是源代码导致的新错误。