如何在 CMake 中安装时使用版本号重命名/修改目标文件?

Posted

技术标签:

【中文标题】如何在 CMake 中安装时使用版本号重命名/修改目标文件?【英文标题】:How to rename/revise target file with version number on installing in CMake? 【发布时间】:2019-11-25 02:34:39 【问题描述】:

我正在使用 CMake-3.13.4 和 KDevelop-5.2.1。

我有一个最顶层的 CMakeLists.txt,它定义了我的目标的版本号。 它看起来像:

set( PROJECT_VERSION_MAJOR 1 )
set( PROJECT_VERSION_MINOR 4 )
set( PROJECT_VERSION_PATCH 7 )
...
add_executable( mytarget main.cpp XXX.cpp ... )
target_link_libraries( mytarget "stdc++fs" $CMAKE_THREAD_LIBS_INIT ... )
install( TARGETS mytarget RUNTIME DESTINATION . )

我希望 CMake 自动将版本字符串附加到目标的文件名。所以我编码如下:

install( TARGETS mytarget RUNTIME DESTINATION . RENAME "mytarget-$PROJECT_VERSION_MAJOR.$PROJECT_VERSION_MINOR.$PROJECT_VERSION_PATCH" )

但它不起作用。

有没有办法用 CMake 完成? 我最终想要的文件名是“mytarget-1.4.7”。

【问题讨论】:

【参考方案1】:

您正在寻找房产OUTPUT_NAME

add_executable( mytarget main.cpp XXX.cpp ... )
target_link_libraries( mytarget "stdc++fs" $CMAKE_THREAD_LIBS_INIT ... )
set_target_properties( mytarget PROPERTIES OUTPUT_NAME "mytarget-$PROJECT_VERSION_MAJOR.$PROJECT_VERSION_MINOR.$PROJECT_VERSION_PATCH" ) 
install( TARGETS mytarget RUNTIME DESTINATION . )

【讨论】:

OUTPUT_NAME 的用途有限:您不能使用它来指定与另一个目标相同的名称,否则MSVC 构建失败。 MSVC 为每个目标创建$OUTPUT_NAME.lib,它可能会发生冲突。【参考方案2】:

我通过如下修改代码得到它:

add_executable( mytarget-$PROJECT_VERSION_MAJOR.$PROJECT_VERSION_MINOR.$PROJECT_VERSION_PATCH 
 main.cpp XXX.cpp ... )

target_link_libraries( mytarget-$PROJECT_VERSION_MAJOR.$PROJECT_VERSION_MINOR.$PROJECT_VERSION_PATCH "stdc++fs" $CMAKE_THREAD_LIBS_INIT ... )

install( TARGETS mytarget-$PROJECT_VERSION_MAJOR.$PROJECT_VERSION_MINOR.$PROJECT_VERSION_PATCH RUNTIME DESTINATION . )

【讨论】:

以上是关于如何在 CMake 中安装时使用版本号重命名/修改目标文件?的主要内容,如果未能解决你的问题,请参考以下文章

在 VS setup 项目中安装时传递 ocx 注册的参数

在其他 iPhone 中安装时,iPhone 中的应用程序安装失败

firefox 扩展通过 sdk 工作,但在浏览器中安装时不能 - 兼容性问题?

unbuntu中安装cmake后怎么修改环境变量

记录archlinux中安装pcl的大致流程

如何在新安装时指定 Lumen(或 Laravel)版本?