【问题标题】:With CMake, how can I use the same source for a library for multiple different builds使用 CMake,我如何为多个不同构建的库使用相同的源
【发布时间】:2014-02-20 09:03:48
【问题描述】:

我需要找到如何最好地使用 CMake 来构建同一个库的多个不同版本。

假设我有软件 A、B 和 C。所有这些都使用相同的外部库,我们称之为 D。假设 D 与 A、B 和 C 相比是巨大的。所以只需使用 svn:external多次结帐是一个糟糕的选择。

我想到的是有一个文件夹,其中包含 A、B、C 和 D 的子文件夹,并且只需调用 add_subdir(../D)。但是为了让事情变得复杂,我不想在其他开发人员身上强制执行这种文件夹结构,所以我最终想到了用 find_package 来做这个工作,不知何故。

我希望看到的是,您能够从 subversion 获取 C 和 D 到任何文件夹,并让 C 为自己编译它自己的 D 版本并使用它,而无需自定义文件夹。

这似乎是一个愚蠢的梦想,但不是地球上最聪明的人,也许有人知道如何实现这一目标。

编辑: 请注意,A B & C 不能为 D 使用相同的二进制文件,因为它们会使用不同的编译器标志来构建库。

【问题讨论】:

  • 由于您不能使用二进制文件,find_package 不是解决方案,因为它的作用是帮助定位要链接的二进制库。
  • 另外,A、B 和 C 是单个 CMake 项目的一部分,还是彼此独立?
  • 它们是完全独立的。
  • SirDarius,当您编写自己的东西让 find_package 运行时,一切皆有可能。
  • 是的,有可能是的,也有只有标题的库。在这种情况下,我相信指向 D 的源代码根目录的简单 cmake 用户可见变量会起作用。

标签: cmake


【解决方案1】:

add_subdirectory 适用于位于主项目目录之外的目录,您只需提供binary_dir

add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL])

在构建中添加一个子目录。 source_dir 指定源 CMakeLists.txt 和代码文件所在的目录。如果它是相对路径,它将相对于当前目录进行评估(典型用法),但它也可能是绝对路径binary_dir 指定放置输出文件的目录。如果它是一个相对路径,它将相对于当前输出目录进行评估,但它也可能是一个绝对路径。

在 A、B 和 C 中,你可以有类似的东西:

set(MYPROJECT_D_PATH "" CACHE PATH "Path to D")

if("${test}" STREQUAL "")
    message(FATAL_ERROR "You must set MYPROJECT_D_PATH")
endif()

add_subdirectory(${MYPROJECT_D_PATH} D)

当你第一次编译 A、B 或 C 时,你提供到 D 的路径是这样的:

cmake <src_dir> -DMYPROJECT_D_PATH=<path_to_D>

【讨论】:

  • 是的,这就是我想使用的,但我想通过某种形式的魔法来提供 path_to_D。所以我不需要手动给它,应该支持手动更改该路径,但如果它没有给出,它会自动被发现。现在让我感到困惑的是自动查找部分。
  • 如果你想自动找到它,又没有任何线索,你必须通过整个硬盘找到D。这显然是一个坏主意。解决此问题的常用方法是使用环境变量和/或默认搜索路径。您可以使用 find_path 轻松使用 CMake。
猜你喜欢
  • 2016-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-26
  • 1970-01-01
  • 2021-04-21
  • 2013-10-30
相关资源
最近更新 更多