pkg-config找不到opencv

问题描述 投票:0回答:4

我在 lubuntu 12.10 发行版上安装了 opencv。然后,当我尝试编译使用 opencv 的代码时,它说找不到它。所以我在终端中尝试:

pkg-config --cflags --libs opencv

它回答我找不到opencv。但这些文件安装在/usr/lib 中。我不明白为什么找不到它们。

c++ opencv pkg-config
4个回答
11
投票

您必须将

pkg-config --cflags --libs opencv
放在 g++ 行的末尾。例如:

g++ test.cpp -o test `pkg-config --cflags --libs opencv`

编译

g++ `pkg-config --cflags --libs opencv` test.cpp -o test

无法编译并且具有未定义的引用。


11
投票

对于 OpenCV 4,您可能必须使用:

pkg-config --cflags --libs opencv4

(注意最后的4!)


2
投票

来自 OpenCV 4:

-DOPENCV_GENERATE_PKGCONFIG=YES
添加到 cmake 构建参数中。

使用

YES
ON
不再起作用了。


0
投票

许多好的答案(和评论)。添加一个综合性的解决方案(希望)可以解决整个问题。
另外,正在更新环境(在回答时):Ubuntu 22(带有OpenCV4)。

根据[FreeDesktop]:pkg-config

pkg-config 是编译应用程序和库时使用的辅助工具。它可以帮助您在命令行上插入正确的编译器选项,以便应用程序可以使用 gcc -o test test.c

pkg-config --libs --cflags glib-2.0
,而不是硬编码值来查找 glib(或其他库)。

示例:

[cfati@cfati-5510-0:/mnt/e/Work/Dev/StackExchange/StackOverflow/q015113753]> . ~/sopr.sh
### Set shorter prompt to better fit when pasted in StackOverflow (or other) pages ###

[064bit prompt]> pkg-config --version
0.29.2
[064bit prompt]> 
[064bit prompt]> # Search for (older) OpenCV
[064bit prompt]> pkg-config --modversion opencv
Package opencv was not found in the pkg-config search path.
Perhaps you should add the directory containing `opencv.pc'
to the PKG_CONFIG_PATH environment variable
No package 'opencv' found
[064bit prompt]> 
[064bit prompt]> # Search for OpenCV4
[064bit prompt]> pkg-config --modversion opencv4
4.5.4

但是 Pkg-Config 如何确定该信息(以及为什么 OpenCV4 可以工作而 OpenCV 却不能)?
答案很简单:它读取(并显示来自).pc 文件的信息。更多详情请参阅:

值得一提的是,它类似于 CMakeFind*.cmake 文件。

因此,Pkg-Config 在默认文件夹列表中搜索 (.pc) 文件。可以通过在 PKG_CONFIG_PATH 中指定来添加更多内容。

[064bit prompt]> # Default search paths (each on separate line) for .pc files
[064bit prompt]> pkg-config --variable pc_path pkg-config | tr ":" "\n"
/usr/local/lib/x86_64-linux-gnu/pkgconfig
/usr/local/lib/pkgconfig
/usr/local/share/pkgconfig
/usr/lib/x86_64-linux-gnu/pkgconfig
/usr/lib/pkgconfig
/usr/share/pkgconfig

返回OpenCV(4):

[064bit prompt]> pkg-config --debug --modversion opencv4 2>&1 | grep "Reading 'opencv4"
Reading 'opencv4' from file '/usr/lib/x86_64-linux-gnu/pkgconfig/opencv4.pc'

以及拥有该文件的实际包:

[064bit prompt]> dpkg -S /usr/lib/x86_64-linux-gnu/pkgconfig/opencv4.pc
libopencv-dev: /usr/lib/x86_64-linux-gnu/pkgconfig/opencv4.pc

因此,为了使OpenCV4能够Pkg-Config,安装OpenCV.deb(和依赖项)是不够的,开发包LibOpenCV-Devlibopencv-dev) )是必需的。

[064bit prompt]> apt list | grep libopencv-dev

WARNING: apt does not have a stable CLI interface. Use with caution in scripts.

libopencv-dev/jammy,now 4.5.4+dfsg-9ubuntu4 amd64 [installed]

使用它的示例。

main00.cpp:

#include <opencv2/core/types.hpp>

#include <stdio.h>


int main()
{
    cv::Mat mat(100, 100, CV_8UC4, cv::Scalar(0x00, 0x00, 0x00, 0x00));
    printf("\nDone.\n\n");
    return 0;
}

输出

[064bit prompt]> ls
main00.cpp
[064bit prompt]>
[064bit prompt]> # Wrong order
[064bit prompt]> g++ $(pkg-config --cflags --libs opencv4) main00.cpp -o main00
/usr/bin/ld: /tmp/cc79oIaV.o: in function `main':
main00.cpp:(.text+0x67): undefined reference to `cv::Mat::Mat(int, int, int, cv::Scalar_<double> const&)'
/usr/bin/ld: main00.cpp:(.text+0x87): undefined reference to `cv::Mat::~Mat()'
/usr/bin/ld: main00.cpp:(.text+0xad): undefined reference to `cv::Mat::~Mat()'
collect2: error: ld returned 1 exit status
[064bit prompt]>
[064bit prompt]> # Right order
[064bit prompt]> g++ main00.cpp $(pkg-config --cflags --libs opencv4) -o main00
[064bit prompt]> ls
main00  main00.cpp
[064bit prompt]> ldd main00
    linux-vdso.so.1 (0x00007ffdeb2c6000)
    libopencv_core.so.4.5d => /lib/x86_64-linux-gnu/libopencv_core.so.4.5d (0x00007f7551e00000)
    libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f7551a00000)
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f7552188000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f7551600000)
    libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f7551de4000)
    libtbb.so.2 => /lib/x86_64-linux-gnu/libtbb.so.2 (0x00007f7551d9e000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f7551cb7000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f75521d2000)
[064bit prompt]>
[064bit prompt]> ./main00

Done.

顺序差异是由于GNU链接器从左到右解析符号(在传递的对象和库中)。将源文件(及其相应的对象 (.o) 文件)保留在最后,会留下未解析的符号(尽管包含这些符号的库在其之前传递 - 因此已经被搜索)。有关更多详细信息,请检查 [SO]:为什么链接库的顺序有时会导致 GCC 中出现错误?.

© www.soinside.com 2019 - 2024. All rights reserved.