Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有了CMake,我如何为多个不同版本的库使用相同的源代码_Cmake - Fatal编程技术网

有了CMake,我如何为多个不同版本的库使用相同的源代码

有了CMake,我如何为多个不同版本的库使用相同的源代码,cmake,Cmake,我需要找到如何最好地使用CMake来构建同一库的多个不同版本 让我们假设我有软件A、B和C。所有这些都使用相同的外部库,让我们称之为D。让我们假设D与A、B和C相比是巨大的。因此,仅使用svn:external多次签出它是一个糟糕的选择 我想到的是有一个文件夹,其中有a、B、C和D的子文件夹,只需调用add_subdir(../D)。但是为了使事情变得复杂,我不想在其他开发人员身上强制使用这个文件夹结构,所以我最终想到了如何使用find_包来实现这个功能 我想看到的是,您可以从subversio

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

让我们假设我有软件A、B和C。所有这些都使用相同的外部库,让我们称之为D。让我们假设D与A、B和C相比是巨大的。因此,仅使用svn:external多次签出它是一个糟糕的选择

我想到的是有一个文件夹,其中有a、B、C和D的子文件夹,只需调用add_subdir(../D)。但是为了使事情变得复杂,我不想在其他开发人员身上强制使用这个文件夹结构,所以我最终想到了如何使用find_包来实现这个功能

我想看到的是,您可以从subversion获得C和d到任何文件夹,并让C为自己编译自己的d版本并使用它,而无需来自自定义文件夹的任何努力

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

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

使用位于主项目目录之外的目录,您只需给出一个
二进制目录即可

添加子目录
(源目录[二进制目录][从所有目录中排除]

将子目录添加到生成中。
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)
cmake <src_dir> -DMYPROJECT_D_PATH=<path_to_D>
当您第一次编译A、B或C时,您提供了D的路径,如下所示:

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)
cmake <src_dir> -DMYPROJECT_D_PATH=<path_to_D>
cmake-DMYPROJECT\u D\u路径=

由于您不能使用二进制文件,
find_package
将不是解决方案,因为它所做的是帮助定位要链接到的二进制库。此外,A、B和C是单个CMake项目的一部分,还是彼此独立?它们是完全独立的。小天狼星,当您为find_package运行编写自己的东西时,事情是有可能的。没错,这是有可能的。是的,也有只有标题的库。在这种情况下,我相信一个简单的cmake用户可见变量指向D的源代码根就可以了。是的,这就是我想使用的,但我想通过某种形式的魔法提供路径。所以我不需要手动给它,应该支持手动改变路径,但是如果没有给它,它会自动被发现。现在,自动查找部分让我感到困惑。如果你想自动查找而没有任何线索,你必须通过整个硬盘来查找D。这显然是个坏主意。通常的解决方法是使用环境变量和/或默认搜索路径。您可以使用
find_path
使用CMake轻松完成此操作。