如何在CMAKE中有条件地在发布模式下建立目标? 我想仅在发布模式下构建目标。 我尝试了以下内容: if(cmake_build_type等于“释放”) 但是它行不通,因为当我使用以下命令构建时 cmake -b ...

问题描述 投票:0回答:1
if (CMAKE_BUILD_TYPE EQUAL "RELEASE")

但它行不通,因为当我使用以下命令构建时

cmake --build . --config Release

显然没有设置
CMAKE_BUILD_TYPE

用现代cmake检测发行版与调试构建的正确方法是什么?

(我找不到使用发电机表达式来有条件定义目标的方法)。
	

我想仅在发布模式下构建目标。 [...](我找不到一种使用发电机表达式来有条件定义目标的方法)。

尽管您不能基于活动配置来定义目标,但您可以在某些配置中构建IT。
为了动机,您可以使用一个包含一些仅发行功能的库,例如扩展日志记录或遥测。我们将这个目标称为

MyProject_Telemetry

。现在,让我们以

MyProject_TelemetryImpl

renamemane

对其进行更安全的链接更新其
cmake build release
1个回答
0
投票
目标(我认为已经存在):

add_library(MyProject_TelemetryImpl) add_library(MyProject::TelemetryImpl ALIAS MyProject_TelemetryImpl) # ... define the target here ...

现在我们将创建一个有条件地链接到它的

wrapper图库: INTERFACE

用来链接到

add_library(MyProject::Telemetry INTERFACE) target_link_libraries( MyProject::Telemetry INTERFACE "$<$<NOT:$<CONFIG:Debug>>:MyProject::TelemetryImpl>" )

的任何东西现在都可以链接到此接口。此接口是空的,除了其对真实库的依赖性,但仅在发行模式中存在依赖关系(即释放,minsizerel和relwithdebinfo)。
现在,如果用户构建了整个项目(通过MyProject::Telemetry
make
,vs中的所有目标等),它仍然会构建
ninja
。要解决此问题,我们只需要设置一个属性:

TelemetryImpl

现在,仅当另一个目标取决于它时,真实库才能构建。正如我们确定的那样,只有在发布模式下才是正确的。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.