多次使用 cmake add_subdirectories 和 [binary_dir]

问题描述 投票:0回答:1

我为每个州创建软件。有一些特定于状态的代码,以及一些在所有状态上运行的通用代码。 我创建了以下目录结构:

   common
        foo
            CMakeLists.txt
        bar 
            CMakeLists.txt
    State
        AL
            bin
            src
                build
                CMakeLists.txt
                DMV 
                    CMakeLists.txt              
                ABC 
                    CMakeLists.txt
        AK
            bin
            src
                build
                CMakeLists.txt
                DMV 
                    CMakeLists.txt
                ABC 
                    CMakeLists.txt

每个状态下的CMakeList.txt

set (COMMON "/home/me/common")
add_subdirectory(${COMMON}/foo {STATE_BIN_DIR})
add_subdirectory(${COMMON}/bar {STATE_BIN_DIR})
add_subdirectory(${DMV)

DMV 目录(和 ABC)中的 CMakeLists.txt

install(TARGETS dmv DESTINATION ${STATE_BIN_DIR})

Common foo 目录(和 bar)中的 CMakeLists.txt

install(TARGETS foo DESTINATION ${STATE_BIN_DIR})

cmake 错误:

The binary directory
/home/me/State/AL/bin is already used to build a source directory.  It cannot be used to build source directory
/home/me/common/bar
Specify a unique binary directory name.

如果我只构建 foo,它就可以正常工作。当我尝试在目录结构之外构建 bar 时,它失败了。 我不明白的是我的所有二进制文件(状态和公共)都将进入状态的 bin 目录。

读这个: CMAKE 添加不是真实目录子目录的子目录

它说“CMake 不能将两个不同的源目录映射到同一个构建目录。”
但所有不同来源(DMV、ABC)都进入垃圾箱。在这里有效。

CMake 的网站没有指定 https://cmake.org/cmake/help/v3.0/command/add_subdirectory.html

有什么办法可以做我想做的事吗? 我知道我可以在 States 目录下创建 foo 和 bar 目录,然后放置一个指向公共代码的 CMakeLisist.txt 。
这样可行。但我想保留食谱和代码。

我想我也可以创建 bin/foo 和 bin/bar 来放入这些二进制文件。 但有些是共享库,我希望将它们放在一个地方。

有什么想法吗?

谢谢

cmake
1个回答
0
投票

我通过在二进制目录中添加一个额外的子文件夹解决了这个问题。它似乎不会对我的构建造成任何问题,并且我已经仔细检查了最终的构建输出(在我的例子中是一个 APK)是否包含所有二进制文件并且确实如此。

在您的情况下,只需使用

add_subdirectory()
即可:

add_subdirectory(${COMMON}/foo {STATE_BIN_DIR}/foo)
add_subdirectory(${COMMON}/bar {STATE_BIN_DIR}/bar)
...

可以在这里找到类似的解决方案,详细说明如下:link

© www.soinside.com 2019 - 2024. All rights reserved.