根据构建配置(调试/发布)设置 cmake 变量,我哪里出了问题?[复制]

Setting a cmake variable based on build configuration (Debug/Release), where am I going wrong? [duplicate]

提问人:Danny 提问时间:12/1/2020 最后编辑:Danny 更新时间:12/1/2020 访问量:434

问:

我是 cmake 的新手,玩得很开心。我希望变量包含路径,具体取决于我是否处于调试或发布配置中。我的代码如下所示:

set( LIBRARY_DIR
    $<$<CONFIG:DEBUG>: "${CMAKE_SOURCE_DIR}/lib/debug">
    $<$<CONFIG:RELEASE>:"${CMAKE_SOURCE_DIR}/lib/release">) # Directory is debug/release dependent
message (STATUS "Directory is ${LIBRARY_DIR}")

然而,我得到的信息令人惊讶:

Directory is $<$<CONFIG:Debug>:;C:/path/lib/debug;>;$<$<CONFIG:Release>:"C:/path/lib/release"

就好像我的生成器根本没有得到解决,并且被解释为字符串文字。这对我来说似乎很奇怪,但正如我所说,我是 cmake 的新手,这对我来说很奇怪。我犯了什么明显的错误吗?

C++ CMake的

评论

0赞 Danny 12/1/2020
@drescherjm 如果是这样,为什么我返回的消息没有解析的路径,而是生成器的文字字符串,有什么原因吗?
0赞 Danny 12/1/2020
@drescherjm是的,看起来确实是这样。有没有办法打印出最终结果而不是内部结构?
0赞 drescherjm 12/1/2020
我删除了我的评论,因为我不是 100% 确定。
0赞 Danny 12/1/2020
@drescherjm是的,我实际上认为你错了。可以肯定的是,它正在将所有这些内容拉入变量中。
0赞 Danny 12/1/2020
作为更新,我确实找到了一个描述相同问题的线程。显然,生成器直到构建阶段才会得到评估。我想知道是否仍然可以按照我想要的方式使用生成器(构建库路径),但这不是我目前的做法:stackoverflow.com/questions/51353110/......

答:

0赞 TerryTsao 12/1/2020 #1

编辑:

再看一眼,不是我最初写的。

你的问题是写论点。你最好看看文档的command_arguments部分。cmake-language

你的问题在于你如何写论点。因此,cmake lexer 获得的令牌与您实际想要的完全不同。您应该使用所谓的 or 来绑定生成器表达式作为一个整体。quoted argumentbracket argument


另一个问题是评估时间。

这是因为发电机是在生成步骤中评估的。请参阅文档的调试部分。cmake-generator-expression

add_custom_target(genexdebug COMMAND ${CMAKE_COMMAND} -E echo "$<...>")

### OR

file(GENERATE OUTPUT filename CONTENT "$<...>")