C++ 用于链接opencv.framework的Makefile(我不使用cmake)
我在项目中使用opencv,现在我使用makefile将项目编译成一个静态库,但总是输出“致命错误:'cv.h'未找到文件”。我已经搜索了这个网站和其他地方,这不是我需要的。我只知道一点makefile语法。我该怎么办 MakefileC++ 用于链接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
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的文件夹更改路径的示例。您是对的,再次感谢。我解决了这个错误,可能是源代码导致的新错误。