CMake 的导出如何知道目标是啥版本?

Posted

技术标签:

【中文标题】CMake 的导出如何知道目标是啥版本?【英文标题】:How does CMake's export know what version the target is?CMake 的导出如何知道目标是什么版本? 【发布时间】:2018-08-06 01:22:42 【问题描述】:

我正在尝试创建一个库。我的 CMakeLists.txt 看起来像这样:

add_library(Lib STATIC)
set_target_properties(Lib PROPERTIES
    VERSION 0.1)
export(TARGETS Lib
    FILE $BIN_DIR/LibConfig.cmake)

当外部项目使用此库时,CMake 会显示错误:

CMake Error at CMakeLists.txt:10 (find_package):
  Could not find a configuration file for package "Lib" that is
  compatible with requested version "0.1".

  The following configuration files were considered but not accepted:

some directory/Lib/bin/LibConfig.cmake, version: unknown

查看生成的LibConfig.cmake,除了没有携带版本信息,没有任何问题。

【问题讨论】:

你的 CMake 版本是什么? @StanleyF。我的 CMake 版本是 3.11.2,但我使用的是 cmake_minimum_required(VERSION 3.5) 【参考方案1】:

要让 CMake 确定您的库的版本,您需要创建一个 LibConfigVersion.cmake 文件。

可以在 CMake 文档中找到一个示例:generating package files

对于您的库,结果如下:

add_library(Lib STATIC)
set_target_properties(Lib PROPERTIES VERSION 0.1)
export(TARGETS LibFILE $BIN_DIR/LibConfig.cmake)

include(CMakePackageConfigHelpers)
write_basic_package_version_file($BIN_DIR/LibConfigVersion.cmake
                                 VERSION 0.1
                                 COMPATIBILITY SameMajorVersion)

您可以在project命令中设置一次,而不是多次提供版本信息:

project(Lib VERSION 0.1)

【讨论】:

以上是关于CMake 的导出如何知道目标是啥版本?的主要内容,如果未能解决你的问题,请参考以下文章

MLlib Estimator 如何知道特征和目标列是啥?

控制共享库的导出符号时,与“gcc -fvisibility=hidden”等效的 CMake 是啥?

CMake 的默认构建目标的名称是啥?

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

CMake:如何构建外部项目并包含其目标

如何强制 CMake 使用系统上安装的特殊版本的 Protobuf?