使用 opencv 和 cpp 的应用程序的 Yocto 配方
Yocto recipe for an application that uses opencv and cpp
我为使用 opencv 流式传输图像的 cpp 应用程序创建了一个配方。但是构建失败并出现以下错误:
日志数据如下:
| DEBUG: Executing shell function do_compile
| shot.cpp:1:10: fatal error: core.hpp: No such file or directory
| 1 | #include "core.hpp"
| | ^~~~~~~~~~
| compilation terminated.
| WARNING: exit code 1 from a shell command.
尽管如此,我将 meta-openembedded/meta-oe 添加到 bblayers,其中包含我在其中找到 core.hpp 的 opencv 文件夹。
食谱如下:
DESCRIPTION = " this is an application display an image"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
SRC_URI = "file://shot.cpp"
DEPENDS = "opencv"
S = "${WORKDIR}"
do_compile () {
${CXX} shot.cpp -lopencv_core -lopencv_imgproc -lopencv_highgui -lopencv_videoio
}
do_install () {
install -d 0755 ${D}/${bindir}
install -m 0755 ${D}/${bindir}
}
当我 运行 使用我安装在 ubuntu 18.04 上的 opencv 的应用程序时。它工作正常(使用 cmake)。
我尝试在食谱旁边手动添加核心文件夹,当然没有用,我还在 SRC_URI 变量中将 core.hpp 的路径添加到食谱,但没有运气好
我不知道该怎么做,因为我是 yocto 和 opencv 的新手;请帮忙
这是应用程序的源代码:
#include "core.hpp"
#include "highgui.hpp"
#include <iostream>
using namespace cv;
using namespace std;
int main( )
{
Mat image;
// LOAD image
image = imread("image1.jpg"); // Read the file "image.jpg".
if(! image.data ) // Check for invalid input
{
cout << "Could not open or find the image" << std::endl ;
return -1;
}
//DISPLAY image
namedWindow( "window"); // Create a window for display.
imshow( "window", image ); // Show our image inside it.
waitKey(0); // Wait for a keystroke in the window
return 0;
}
我认为你的食谱需要做一些修改:
[...]
inherit pkgconfig
DEPENDS = "opencv"
[...]
并且您需要添加一个 RDEPENDS 和 FILES 变量:
[...]
DEPENDS = "opencv"
# Add the runtime dependencies
RDEPENDS_${PN} = "libopencv-core libopencv-imgproc libopencv-highgui libopencv-videoio libopencv-imgcodecs"
[...]
# At the end, ship the files
FILES_${PN} = "${bindir}"
RDEPENDS_${PN}
会告诉 Yocto 您的食谱包 ${PN}
需要一个 运行 时间依赖项列表。 运行 您的开发板上的应用程序(通常是库)需要这些依赖项。
FILES_${PN}
将告诉 Yocto 您的食谱包 ${PN}
将包含文件。如果没有这一行,Yocto 会告诉你
${PN}
默认是你的食谱文件名(没有版本和 .bb
)
还有一些错误。
编译有一些问题,没有添加lopencv_imgcodecs,也没有你的二进制文件的输出名称(我已经命名为shot
):
do_compile () {
${CXX} ${WORKDIR}/shot.cpp -o ${WORKDIR}/shot -lopencv_core -lopencv_imgproc -lopencv_highgui -lopencv_imgcodecs ${LDFLAGS}
}
第二个安装命令不对:
install -m 0755 ${WORKDIR}/shot ${D}/${bindir}
您的应用程序没有正确的 headers:
#include "opencv2/opencv.hpp"
#include "opencv2/highgui/highgui.hpp"
最后,食谱看起来像:
DESCRIPTION = " this is an application display an image"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
SRC_URI = "file://shot.cpp"
inherit pkgconfig
DEPENDS = "opencv"
RDEPENDS_${PN} = "libopencv-core libopencv-imgproc libopencv-highgui libopencv-videoio libopencv-imgcodecs"
S = "${WORKDIR}"
do_compile () {
${CXX} ${WORKDIR}/shot.cpp -o ${WORKDIR}/shot -lopencv_core -lopencv_imgproc -lopencv_highgui -lopencv_imgcodecs ${LDFLAGS}
}
do_install () {
install -d 0755 ${D}/${bindir}
install -m 0755 ${WORKDIR}/shot ${D}/${bindir}
}
FILES_${PN} = "${bindir}"
以及申请:
#include "opencv2/opencv.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <iostream>
using namespace cv;
using namespace std;
int main( )
{
Mat image;
// LOAD image
image = imread("image1.jpg"); // Read the file "image.jpg".
if(! image.data ) // Check for invalid input
{
cout << "Could not open or find the image" << std::endl ;
return -1;
}
//DISPLAY image
namedWindow( "window"); // Create a window for display.
imshow( "window", image ); // Show our image inside it.
waitKey(0); // Wait for a keystroke in the window
return 0;
}
该食谱适用于我的 Yocto 战士 meta。
我为使用 opencv 流式传输图像的 cpp 应用程序创建了一个配方。但是构建失败并出现以下错误:
日志数据如下:
| DEBUG: Executing shell function do_compile
| shot.cpp:1:10: fatal error: core.hpp: No such file or directory
| 1 | #include "core.hpp"
| | ^~~~~~~~~~
| compilation terminated.
| WARNING: exit code 1 from a shell command.
尽管如此,我将 meta-openembedded/meta-oe 添加到 bblayers,其中包含我在其中找到 core.hpp 的 opencv 文件夹。
食谱如下:
DESCRIPTION = " this is an application display an image"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
SRC_URI = "file://shot.cpp"
DEPENDS = "opencv"
S = "${WORKDIR}"
do_compile () {
${CXX} shot.cpp -lopencv_core -lopencv_imgproc -lopencv_highgui -lopencv_videoio
}
do_install () {
install -d 0755 ${D}/${bindir}
install -m 0755 ${D}/${bindir}
}
当我 运行 使用我安装在 ubuntu 18.04 上的 opencv 的应用程序时。它工作正常(使用 cmake)。
我尝试在食谱旁边手动添加核心文件夹,当然没有用,我还在 SRC_URI 变量中将 core.hpp 的路径添加到食谱,但没有运气好 我不知道该怎么做,因为我是 yocto 和 opencv 的新手;请帮忙
这是应用程序的源代码:
#include "core.hpp"
#include "highgui.hpp"
#include <iostream>
using namespace cv;
using namespace std;
int main( )
{
Mat image;
// LOAD image
image = imread("image1.jpg"); // Read the file "image.jpg".
if(! image.data ) // Check for invalid input
{
cout << "Could not open or find the image" << std::endl ;
return -1;
}
//DISPLAY image
namedWindow( "window"); // Create a window for display.
imshow( "window", image ); // Show our image inside it.
waitKey(0); // Wait for a keystroke in the window
return 0;
}
我认为你的食谱需要做一些修改:
[...]
inherit pkgconfig
DEPENDS = "opencv"
[...]
并且您需要添加一个 RDEPENDS 和 FILES 变量:
[...]
DEPENDS = "opencv"
# Add the runtime dependencies
RDEPENDS_${PN} = "libopencv-core libopencv-imgproc libopencv-highgui libopencv-videoio libopencv-imgcodecs"
[...]
# At the end, ship the files
FILES_${PN} = "${bindir}"
RDEPENDS_${PN}
会告诉 Yocto 您的食谱包 ${PN}
需要一个 运行 时间依赖项列表。 运行 您的开发板上的应用程序(通常是库)需要这些依赖项。
FILES_${PN}
将告诉 Yocto 您的食谱包 ${PN}
将包含文件。如果没有这一行,Yocto 会告诉你
${PN}
默认是你的食谱文件名(没有版本和 .bb
)
还有一些错误。
编译有一些问题,没有添加lopencv_imgcodecs,也没有你的二进制文件的输出名称(我已经命名为shot
):
do_compile () {
${CXX} ${WORKDIR}/shot.cpp -o ${WORKDIR}/shot -lopencv_core -lopencv_imgproc -lopencv_highgui -lopencv_imgcodecs ${LDFLAGS}
}
第二个安装命令不对:
install -m 0755 ${WORKDIR}/shot ${D}/${bindir}
您的应用程序没有正确的 headers:
#include "opencv2/opencv.hpp"
#include "opencv2/highgui/highgui.hpp"
最后,食谱看起来像:
DESCRIPTION = " this is an application display an image"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
SRC_URI = "file://shot.cpp"
inherit pkgconfig
DEPENDS = "opencv"
RDEPENDS_${PN} = "libopencv-core libopencv-imgproc libopencv-highgui libopencv-videoio libopencv-imgcodecs"
S = "${WORKDIR}"
do_compile () {
${CXX} ${WORKDIR}/shot.cpp -o ${WORKDIR}/shot -lopencv_core -lopencv_imgproc -lopencv_highgui -lopencv_imgcodecs ${LDFLAGS}
}
do_install () {
install -d 0755 ${D}/${bindir}
install -m 0755 ${WORKDIR}/shot ${D}/${bindir}
}
FILES_${PN} = "${bindir}"
以及申请:
#include "opencv2/opencv.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <iostream>
using namespace cv;
using namespace std;
int main( )
{
Mat image;
// LOAD image
image = imread("image1.jpg"); // Read the file "image.jpg".
if(! image.data ) // Check for invalid input
{
cout << "Could not open or find the image" << std::endl ;
return -1;
}
//DISPLAY image
namedWindow( "window"); // Create a window for display.
imshow( "window", image ); // Show our image inside it.
waitKey(0); // Wait for a keystroke in the window
return 0;
}
该食谱适用于我的 Yocto 战士 meta。