![](/img/trans.png)
[英]How to compile C++ code that contains OpenCV library without Makefile?
[英]Makefile to compile a class with main opencv
我希望你们一切都好。
我目前正在学习 opencv (c++),我正在尝试使用名为“算法”(.h 和 .cpp)的 class 编译“main.cpp”,由于某种原因,我在尝试时遇到了这样的错误:
g++ `pkg-config --cflags opencv4` `pkg-config --libs opencv4` src/Algorithms.cpp -o obj/Algorihtms.o -lopencv_core -lopencv_imgproc -lopencv_highgui -lopencv_imgcodecs
/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/Scrt1.o: in function `_start':
(.text+0x24): undefined reference to `main'
collect2: error: ld returned 1 exit status
make: *** [makefile:15: obj/Algorithms.o] Error 1
这是我的 makefile:
CFLAGS = `pkg-config --cflags opencv4`
LIBS = `pkg-config --libs opencv4`
B = bin
O = obj
S = src
FLAGS = -c -Wall
all: $(O) $(B) $(B)/main
$(B)/main: $(O)/Algorithms.o
g++ $(FLAGS) -ggdb $(S)/main.cpp -o $(O)/main.o
$(O)/Algorithms.o:
g++ $(CFLAGS) $(LIBS) $(S)/Algorithms.cpp -o $(O)/Algorihtms.o -lopencv_core -lopencv_imgproc -lopencv_highgui -lopencv_imgcodecs
$(O):
mkdir $(O)
$(B):
mkdir $(B)
clean: $(O) $(B)
rm -rf $(O)
rm -rf $(B)
(安装了Opencv,我知道如果我单独编译“main.cpp”它可以工作,但我不能同时编译“main.cpp”和class“算法”。)
非常感谢。
如果您不想链接到可执行文件,则需要使 GCC 知道。 默认是编译和链接。 使用选项-c
:
$(O)/Algorithms.o:
g++ -c $(CFLAGS) $(LIBS) $(S)/Algorithms.cpp -o $(O)/Algorihtms.o -lopencv_core -lopencv_imgproc -lopencv_highgui -lopencv_imgcodecs
从手册页:
当您调用 GCC 时,它通常会进行预处理、编译、汇编和链接。 “总体选项”允许您在中间阶段停止此过程。 例如,-c 选项表示不运行 linker。 然后 output 由汇编程序的 object 文件 output 组成。
但是,在您的情况下,正如我在评论中提到的那样,问题是为什么您根本需要一个中间 object 文件。
回答我自己的问题。
我不知道为什么我没有在我的 makefile 中立即弄清楚这一点。
不管怎样,这是一个可以完成工作的 makefile:
CFLAGS = `pkg-config --cflags opencv4`
LIBS = `pkg-config --libs opencv4`
B = bin
O = obj
S = src
FLAGS = -c -Wall
all: $(O) $(B) $(B)/main
$(B)/main: $(O)/Algorithms.o
g++ $(CFLAGS) $(LIBS) $(S)/main.cpp -o $(B)/main $(O)/*.o -lopencv_core -lopencv_imgproc -lopencv_highgui -lopencv_imgcodecs
$(O)/Algorithms.o:
g++ $(FLAGS) $(CFLAGS) $(LIBS) $(S)/Algorithms.cpp -o $(O)/Algorithms.o
$(O):
mkdir $(O)
$(B):
mkdir $(B)
clean: $(O) $(B)
rm -rf $(O)
rm -rf $(B)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.