我觉得我必须做一些根本错误的事情。我基于cmake项目创建了一个配方。使用创建的工具链yocto编译项目就像运行 cmake 然后 make 一样简单,但无法使用配方进行编译:
SUMMARY = "Opendnp3 is the de facto reference implementation of IEEE-1815 (DNP3)"
DESCRIPTION = "Opendnp3 is a portable, scalable, and rigorously tested implementation of the DNP3 (www.dnp.org) protocol stack written in C++11. The library is designed for high-performance applications like many concurrent TCP sessions or huge device simulations. It also embeds very nicely on Linux."
HOMEPAGE = "https://www.automatak.com/opendnp3"
SECTION = "libs"
DEPENDS = "asio"
LICENSE = "Apache-2.0"
LIC_FILES_CHKSUM = "file://NOTICE;md5=9788d3abe6c9401d72fdb3717de33e6a"
SRCREV = "e00ff31b837821064e5208c15866a9d46f8777b1"
SRC_URI = "git://github.com/automatak/dnp3;branch=2.0.x"
S = "${WORKDIR}/git"
inherit cmake
EXTRA_OECMAKE += ""
问题是我认为用于g ++的CXXFLAGS似乎与工具链环境定义的CXXFLAGS不一致。主要缺少 - sysroot ,g ++无法找到标准c ++标头(例如: cstdint )。
我通过删除 -DCMAKE_TOOLCHAIN_FILE = $ {WORKDIR} /toolchain.cmake 来重写cmake.bbclas中的do_configure,从而部分解决了这个问题。事实上,CXXFLAGS由toolchain.cmake定义为:
-march=armv7-a -mfpu=neon -mfloat-abi=hard -mcpu=cortex-a8 --sysroot=/home/star/moxa-build/tmp/work/cortexa8hf-neon-poky-linux-gnueabi/dnp3/2.2.0-r0/recipe-sysroot -O2 -pipe -g -feliminate-unused-debug-types -fdebug-prefix-map=/home/star/moxa-build/tmp/work/cortexa8hf-neon-poky-linux-gnueabi/dnp3/2.2.0-r0=/usr/src/debug/dnp3/2.2.0-r0 -fdebug-prefix-map=/home/star/moxa-build/tmp/work/cortexa8hf-neon-poky-linux-gnueabi/dnp3/2.2.0-r0/recipe-sysroot-native= -fdebug-prefix-map=/home/star/moxa-build/tmp/work/cortexa8hf-neon-poky-linux-gnueabi/dnp3/2.2.0-r0/recipe-sysroot= -fvisibility-inlines-hidden -march=armv7-a -mfpu=neon -mfloat-abi=hard -mcpu=cortex-a8 --sysroot=/home/star/moxa-build/tmp/work/cortexa8hf-neon-poky-linux-gnueabi/dnp3/2.2.0-r0/recipe-sysroot
因此,sysroot被定义为(实际上两次):
/home/star/moxa-build/tmp/work/cortexa8hf-neon-poky-linux-gnueabi/dnp3/2.2.0-r0/recipe-sysroot
但不会在cmake生成的Makefile中结束,所以我想toolchain.cmake中的某些内容会使项目的cmake配置向南移动。
原来这是项目本身的一个问题。在其中一个包含的.cmake配置文件中,C和CXX标志之间存在着快速的混淆。我将向维护者提交拉取请求。 CXXFLAGS在SDK(直接包含在CXX命令中)和bitbake之间的处理方式不同,解释了为什么它与SDK一起工作(但仍不太确定为什么它在没有toolchain.cmake的情况下工作)。
感谢。
答案 0 :(得分:0)
--sysroot
缺少 CXXFLAGS
,因为yocto将其填入CXX
变量本身。请注意,除sysroots
目录外,yocto还有一个environment-setup-XXX
文件,您应该提供该文件。这就是所有sysroot内容的来源。