繁体   English   中英

Makefile 编译一个 class 与主 opencv

[英]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)
    

我确信这个 makefile 不是最有效的,它可以在很多方面进行改进。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM