【问题标题】:make cannot find OpenCV libraries during make callmake 在 make 调用期间找不到 OpenCV 库
【发布时间】:2020-12-24 00:52:50
【问题描述】:

我正在尝试 make 来自 github 存储库的 C++ 程序。我已经将 repo 和 cd 克隆到其中。根据说明,我运行make 进行构建。这是原始的 Makefile:

# Makefile for heartbeat
appname := Heartbeat

CXX := g++
RM := rm -f
CXXFLAGS := -Wall -g -std=c++11 -I/usr/local/include/opencv4
LDFLAGS := -g
LDLIBS := -lopencv_core -lopencv_dnn -lopencv_highgui -lopencv_imgcodecs -lopencv_imgproc -lopencv_objdetect -lopencv_video -lopencv_videoio

SRCS := $(shell find . -name "*.cpp")
OBJS = $(subst .cpp,.o,$(SRCS))

all: $(appname)

$(appname): $(OBJS)
    $(CXX) $(CXXFLAGS) $(LDFLAGS) -o $(appname) $(OBJS) $(LDLIBS)

depend: .depend

.depend: $(SRCS)
    $(RM) ./.depend
    $(CXX) $(CXXFLAGS) -MM $^>>./.depend;

clean:
    $(RM) $(appname) $(OBJS)

dist-clean: clean
    $(RM) *~ .depend

include .depend

当我运行它时,我得到了这个错误:

g++ -Wall -g -std=c++11 -I/usr/local/include/opencv4 -g -o Heartbeat ./RPPG.o ./Heartbeat.o ./opencv.o -lopencv_core -lopencv_dnn -lopencv_highgui -lopencv_imgcodecs -lopencv_imgproc -lobjdetect -lopencv_video -lopencv_videoio
ld: library not found for -lopencv_core
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [Heartbeat] Error 1

所以我调整了 opencv 的 -I include 路径,以反映我在机器上安装它的位置。我在这里安装了它(并在 python 中经常使用它): Users/asi/anaconda3/pkgs/libopencv-3.4.2-h7c891bd_1/include/opencv2

有了这个,我制作了一个新的 Makefile:

# Makefile for heartbeat
appname := Heartbeat

CXX := g++
RM := rm -f
CXXFLAGS := -Wall -g -std=c++11 -I/Users/asi/anaconda3/pkgs/libopencv-3.4.2-h7c891bd_1/include
LDFLAGS := -g
LDLIBS := -lopencv_core -lopencv_dnn -lopencv_highgui -lopencv_imgcodecs -lopencv_imgproc -lobjdetect -lopencv_video -lopencv_videoio

SRCS := $(shell find . -name "*.cpp")
OBJS = $(subst .cpp,.o,$(SRCS))

all: $(appname)

$(appname): $(OBJS)
        $(CXX) $(CXXFLAGS) $(LDFLAGS) -o $(appname) $(OBJS) $(LDLIBS)

depend: .depend

.depend: $(SRCS)
        $(RM) ./.depend
        $(CXX) $(CXXFLAGS) -MM $^>>./.depend;

clean:
        $(RM) $(appname) $(OBJS)

dist-clean: clean
        $(RM) *~ .depend

include .depend

但我仍然收到此错误:

g++ -Wall -g -std=c++11 -I/Users/asi/anaconda3/pkgs/libopencv-3.4.2-h7c891bd_1/include   -c -o Heartbeat.o Heartbeat.cpp
g++ -Wall -g -std=c++11 -I/Users/asi/anaconda3/pkgs/libopencv-3.4.2-h7c891bd_1/include   -c -o opencv.o opencv.cpp
g++ -Wall -g -std=c++11 -I/Users/asi/anaconda3/pkgs/libopencv-3.4.2-h7c891bd_1/include -g -o Heartbeat ./RPPG.o ./Heartbeat.o ./opencv.o -lopencv_core -lopencv_dnn -lopencv_highgui -lopencv_imgcodecs -lopencv_imgproc -lobjdetect -lopencv_video -lopencv_videoio
ld: library not found for -lopencv_core
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [Heartbeat] Error 1

我不知道该怎么办。我将所有库都安装在我的 -I 调用引用的路径中。为什么make 找不到?

作为参考,我在 Mac (Catalina OS) 上运行。

【问题讨论】:

  • 您需要使用-L 设置库文件夹的位置,类似于您使用-I 添加包含路径的方式
  • 你使用 homebrew 吗?
  • @MarkSetchell 是的。我想我是通过 pip 或 conda 安装 cv2 的。我应该通过 brew 安装吗?
  • @drescherjm 喜欢这样吗? g++ -Wall -g -std=c++11 -I/Users/asi/anaconda3/pkgs/libopencv-3.4.2-h7c891bd_1/include -L/Users/asi/anaconda3/pkgs/libopencv-3.4.2-h7c891bd_1/include -g -o Heartbeat ./RPPG.o ./Heartbeat.o ./opencv.o -lopencv_core -lopencv_dnn -lopencv_highgui -lopencv_imgcodecs -lopencv_imgproc -lobjdetect -lopencv_video -lopencv_videoio。我仍然遇到同样的错误。
  • -L/Users/asi/anaconda3/pkgs/libopencv-3.4.2-h7c891bd_1/include 类似,但我认为 opencv 库的 .a 或 .so 文件不在此文件夹中。您需要使用正确的路径。

标签: python c++ opencv gcc makefile


【解决方案1】:

homebrew 或多或少总是符号链接它安装的所有二进制文件:

/usr/local/Cellar/PACKAGENAME/PACKAGEVERSION

/usr/local/bin

所以您只需要在您的 PATH 上使用 /usr/local/bin 即可获得所有 homebrew 软件包的最新二进制文件。那么,让我们看看我用 homebrew 安装的pdfimages

ls -l /usr/local/bin/pdfimages
lrwxr-xr-x   1 mark  admin        38 Jul 14 15:54 pdfimages -> ../Cellar/poppler/0.90.1/bin/pdfimages

同样,它会将所有头文件放入

/usr/local/include

以及

中的所有库
/usr/local/lib

所以你通常只需要编译以下内容:

g++ -std=c++XX source.cpp -I /usr/local/include -L /usr/local/lib -lXXX -lYYY -lZZZ -o program

如果做不到这一点,只需使用 find 查找您的库,然后相应地设置 -L XXX

# Look for OpenCV libraries in /usr, /opt and $HOME
find /usr /opt $HOME -type f -iname "*opencv*so" 2> /dev/null

或者,您可以按照与here. 所述完全相同的方式使用pkgconfig

【讨论】:

    猜你喜欢
    • 2018-02-07
    • 1970-01-01
    • 1970-01-01
    • 2013-08-19
    • 2020-05-11
    • 1970-01-01
    • 2016-04-05
    • 1970-01-01
    • 2020-01-06
    相关资源
    最近更新 更多