如何在由Yocto构建的CMAKE项目中添加预处理器定义

3
我正在处理一个已存在的项目,该项目使用CMake进行配置和生成。 目标是一个ARM设备,所以我使用Yocto/OpenEmbedded构建整个系统。
我成功地创建了一个配方来构建cmake项目。 它看起来像这样:
DESCRIPTION = "FANN LIB"

LICENSE = "CLOSED"

inherit cmake

SRCREV = "${AUTOREV}"

PV = "1.0"

SRC_URI = "git://github.com/libfann/fann.git;branch=master;protocol=git"

S = "${WORKDIR}/git"
BBCLASSEXTEND = "native" 

FILES_${PN} += "/usr/lib/cmake/"

在代码中有一个"#ifdef DEBUG",我想要激活它。所以我想要将DEBUG添加到C/C++标志中。
我发现我可以使用
EXTRA_OECMAKE += "CXXFLAGS='-DDEBUG'"
EXTRA_OECMAKE = "set(CMAKE_CXX_FLAGS "-DDEBUG")"

但是两者都替换了所有的CFlags,这不是我想要的(而且还导致编译出错!)
我只希望在调用编译器时添加-DDEBUG! :-)
在一个基于CMake的项目中,在Yocto配方中如何添加预处理定义?

2
@jww:你提出的重复问题是关于在项目的CMakeLists.txt中“内部”添加标志。而当前的问题是关于在Yocto中“外部”添加标志,这是完全不同的事情。 - Tsyvarev
@Tsyvarev - 是的,我也是这么想的。然后我重新审查了被接受的答案。 - jww
接受的答案主要介绍了Yocto方式(“外部”)设置预处理宏的方法。只有最后一段提到了CMakeLists.txt(“内部”)的方式。但是这个注意事项对于外部方式的工作非常重要:如果项目重写编译器标志(CMAKE_CXX_FLAGS),那么所有的“外部”设置都将丢失。因此,项目的正确方式是追加标志。 - Tsyvarev
1个回答

9

我在配方文件中使用这个任务来构建目标(也基于cmake):

# This flag is also propagated to CXXFLAGS
TARGET_CFLAGS += "-DSOME_FLAG"

我不确定为什么CFLAGS会传播到CXXFLAGS,所以您也可以尝试使用OpenEmbeedded中的变量。请参见Yocto mega manual

请注意,这将仅为目标构建添加标志(即结果仅在目标上使用)。我看到您还在构建本机变体,因此BUILD_CXXFLAGS可能有所帮助。对于nativesdk变体,还有BUILDSDK_CXXFLAGS(这不是您的情况)。这些变量在CXXFLAGS变量说明手册中有清晰的描述。

顺便说一下,与CMake相关的一件事:如果您在CMakeLists.txt中使用set(CMAKE_CXX_FLAGS“-DDEBUG”),则需要在右侧重复CMAKE_CXX_FLAGS,即set(CMAKE_CXX_FLAGS"${CMAKE_CXX_FLAGS} -DDEBUG"),否则您的标志将被覆盖。请参见此博客获取更多信息。


我设置了TARGET_CFLAGS。设置TARGET_CXXFLAGS不会改变任何事情(至少对于FANN项目来说)。 - AntoineC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接