Makefile для компиляции класса с основным opencv - PullRequest
0 голосов
/ 01 августа 2020

Надеюсь, у вас все в порядке.

В настоящее время я изучаю opencv (c ++) и пытаюсь скомпилировать «main. cpp» с классом под названием «Algorithms» (. H и. 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

Вот мой make-файл:

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 "и класс" Algorithm "скомпилировать одновременно.)

Большое спасибо.

Ответы [ 2 ]

0 голосов
/ 03 августа 2020

Отвечая на свой вопрос.
Я не знаю, почему я не понял это сразу в моем make-файле.
Как бы то ни было, вот рабочий make-файл, который выполняет эту работу:

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)
    

Я уверен, что этот make-файл не самый эффективный и его можно улучшить разными способами.
0 голосов
/ 01 августа 2020

Если вы не хотите ссылаться на исполняемый файл, вам необходимо сообщить G CC. По умолчанию выполняется компиляция и связывание. Используйте опцию -c:

$(O)/Algorithms.o: 
    g++ -c $(CFLAGS) $(LIBS) $(S)/Algorithms.cpp -o $(O)/Algorihtms.o -lopencv_core -lopencv_imgproc -lopencv_highgui -lopencv_imgcodecs

Из справочной страницы:

Когда вы вызываете G CC, он обычно выполняет предварительную обработку, компиляцию, сборку и компоновку. «Общие параметры» позволяют остановить этот процесс на промежуточном этапе. Например, параметр - c запрещает запускать компоновщик. Тогда вывод состоит из объектных файлов, выводимых ассемблером.

Однако в вашем случае, как упоминалось в моем комментарии, возникает вопрос, зачем вам вообще нужен промежуточный объектный файл.

...