不止一次地使用带有[binary_dir]的cmake add_subdirectories

时间:2017-05-10 21:55:12

标签: cmake

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

   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目录(和栏)中的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时,它会失败。 我不明白的是我的所有二进制文件(状态和公共)都将进入State的bin目录。

阅读本文: CMAKE add sub-directory which is not sub-directory on real directory

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

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

有什么工作要做我想要的吗? 我知道我可以在States目录下创建foo和bar drirectory,只需放一个指向共同代码的CMakeLisist.txt。
这样可行。但我想保留配方代码。

我想我也可以创建bin / foo和bin / bar来放置这些二进制文件。 但有些是我想在一个地方共享的库。

有什么想法吗?

由于

1 个答案:

答案 0 :(得分:0)

我通过在二进制目录中添加一个额外的子文件夹解决了这个问题。它似乎没有导致我的构建出现任何问题,并且我已经加倍检查了最终构建输出(在我的情况下是一个APK),如果所有二进制文件都包含在内并且确实存在。

在您的情况下,只需使用add_subdirectory()

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

此处可以找到类似的解决方案:link