我在 lubuntu 12.10 发行版上安装了 opencv。然后,当我尝试编译使用 opencv 的代码时,它说找不到它。所以我在终端中尝试:
pkg-config --cflags --libs opencv
它回答我找不到opencv。但这些文件安装在/usr/lib 中。我不明白为什么找不到它们。
您必须将
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
无法编译并且具有未定义的引用。
对于 OpenCV 4,您可能必须使用:
pkg-config --cflags --libs opencv4
(注意最后的4!)
来自 OpenCV 4:
将
-DOPENCV_GENERATE_PKGCONFIG=YES
添加到 cmake 构建参数中。
使用
YES
,ON
不再起作用了。
许多好的答案(和评论)。添加一个综合性的解决方案(希望)可以解决整个问题。
另外,正在更新环境(在回答时):Ubuntu 22(带有OpenCV4)。
pkg-config 是编译应用程序和库时使用的辅助工具。它可以帮助您在命令行上插入正确的编译器选项,以便应用程序可以使用 gcc -o test test.c
,而不是硬编码值来查找 glib(或其他库)。pkg-config --libs --cflags glib-2.0
示例:
[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 文件的信息。更多详情请参阅:
man pgk-config
来自(上述)失败命令的错误消息也可能给出一些提示
值得一提的是,它类似于 CMake 的 Find*.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-Dev(libopencv-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 中出现错误?.