【问题标题】:Makefile to compile a class with main opencvMakefile 用 main opencv 编译一个类
【发布时间】:2020-08-01 09:45:03
【问题描述】:

希望你们一切都好。

我目前正在学习opencv(c ++),我正在尝试用一个名为“算法”(.h和.cpp)的类编译一个“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

这是我的生成文件:

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”和“算法”类。)

非常感谢。

【问题讨论】:

  • 为什么不将Algorithms.cppmain.cpp 作为主要目标的来源?
  • 作为菜鸟,我不知道该怎么做。请你有一个非常简单的例子。将不胜感激。

标签: c++ opencv opencv3.0 makefile


【解决方案1】:

如果您不想链接到可执行文件,则需要让 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 选项说不运行链接器。然后输出由 汇编程序。

但是,在您的情况下,正如我在评论中提到的那样,问题是为什么您需要一个中间对象文件。

【讨论】:

    【解决方案2】:

    回答我自己的问题。
    我不知道为什么我没有立即在我的 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 不是最有效的,它可以在很多方面进行改进。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-10
      • 2018-02-13
      • 1970-01-01
      • 1970-01-01
      • 2012-04-09
      • 2018-04-23
      相关资源
      最近更新 更多