c++ - cmake格式化字符串输出

标签 c++ boost cmake

我正在使用 cmake (3.1),并且尝试将传递给 find_package() 函数的版本字符串转换为另一个 find_package() 函数使用的特殊格式的版本字符串。特别是,我正在尝试转换看起来像的东西

"1.57.0"

变成看起来像的东西

"105700"

(如果您还没猜到,这是针对 FindBoost.cmake 的,它需要“105700”形式的 Boost_VERSION)。

我只是意识到我不知道如何在 cmake 中执行此操作;似乎没有命令/宏扩展/函数来执行具有固定字段宽度和前导零的格式化输出?就像 printf 中的 %d%03d%02d 一样。或者有吗?

更新:我弄乱了版本号。已更新以反射(reflect)这一点。

Update2:看起来 FindBoost.cmake 中的版本逻辑对我来说失败了,原因比我在这里所说的更微妙。

正如下面的 @Torbjörn 和 @Antonio 所指出的,Boost_VERSION 是 FindBoost.cmake 的 OUTPUT 变量,而不是用作输入的自动构造的变量。相反,find_package(Boost 1.57.0) 会自动创建名为 Boost_FIND_VERSIONBoost_FIND_VERSION_MAJORBoost_FIND_VERSION_MINOR 的变量>Boost_FIND_VERSION_PATCHBoost_FIND_VERSION_TWEAK。然后,FindBoost.cmake 根据这些本身构造 Boost_VERSION,并将它们与 105700 形式的版本号进行比较,类似于 version.hpp 中出现的内容在Boost源中。我感到困惑的根源在于,当我调用 find_package(Boost 1.57.0) 时,FindBoost.cmake 似乎在构建 Boost_VERSION 时出现问题,并未能通过其版本检查。然后,当我尝试 find_package(Boost 105700) 时,它似乎不再无法通过检查。也许有逻辑来检测 version.hpp 样式版本(即 Boost_FIND_VERSION_MAJOR 中的整个版本?)或者也许 find_package(Boost 105700)损坏了其他东西。

无论如何,了解 cmake 还没有格式化字符串输出的功能是有启发性的。

最佳答案

悲观答案
不,CMake 中没有用于生成格式化输出的功能。

乐观的答案
自己动手。

我不知道用前导点和尾随点填充版本字符串的确切逻辑,但是 string command提供您可能需要的所有子命令(加上一个或另一个 if block )。 例如,使用 REPLACE 去掉点:

string(REPLACE "." "" "${version}" version_wo_dots)

关于c++ - cmake格式化字符串输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38985973/

上一篇:C++ 歌曲打印问题

下一篇:c++ - 错误-11

相关文章:

c++ - boost 文件系统3中的规范化功能

c++ - 如何避免插入函数中的指针失效?

c++ - "open"对于接受者来说意味着什么?

c++ - 链接整个文件夹

Cmake:包含目录的 target_link_libraries 传播

c++ - 在 C++ 中,如何在另一个嵌套类中使用嵌套类类型(两个嵌套类在同一个外部类下)

c++ - 动态生成的 QTreeWidget 中的父依赖 QTreeWidgetItem 复选框

boost - C++/Cli : Could not load file or assembly X or one of its dependencies. 不是有效的 Win32 应用程序。 (来自 HRESULT 的异常:0x800700C1)

python - 导出函数时boost python模板参数推导/替换失败

c++ - 如果我想链接静态库并删除未使用的符号,该如何处理Cmakelist.txt