【问题标题】:CMake Nested Projects and TargetsCMake 嵌套项目和目标
【发布时间】:2016-02-04 23:42:47
【问题描述】:

我在从 CMake 源代码树构建特定 Visual Studio 项目时遇到问题。想象一下,我们在不同的子目录中有多个目标。在一个子目录中,我们启动了一个新项目(和解决方案)。此项目目标中的项目应属于 ALL_BUILD,但不属于父级 ALL_BUILD。

简而言之:

project(Main)

add_executable(MainApplication ...)
target_link_libraries(MainApplication PRIVATE Library_A)

add_subdirectory(Library_A)
   add_library(Library_A STATIC ...)

add_subdirectory(Other_Related_Stuff_Using_MainApplication)
   project(OtherRelatedStuff)
   add_custom_target(OtherTarget ... DEPENDS MainApplication)

现在使用 Visual Studio 生成器,我们得到两个解决方案文件。这是正确和正确的。在这两种解决方案中,我们都有这三个项目(因为 OtherReleatedStuff 依赖于 MainApplication 构建,而 OtherRelatedStuff 是 Main-Project 的一部分)。

现在:ALL_BUILD 构建所有项目。

当我设置时

set_target_properties(OtherTarget PROPERTIES EXCLUDE_FROM_ALL 1 EXCLUDE_FROM_DEFAULT_BUILD 1)

...在这两种解决方案中,OtherTarget 均禁用

我想做的是:

解决方案 1: 在 Main.Sln 中不应有 OtherTarget。在 OtherRelatedStuff.sln 中可能有 MainApplication,但不应构建。也许也不应该有 MainApplication。

解决方案 2: 在 Main.Sln 中,OtherTarget 永远不应构建(从构建中排除)。在 OtherRelatedStuff.sln 中,OtherTarget 应该构建,但依赖项不可见,甚至不应该可见。

有解决办法吗?

【问题讨论】:

    标签: c++ visual-studio visual-studio-2012 cmake


    【解决方案1】:

    在一个 CMakeLists.txt 源树中找到的所有目标都将生成一个 Visual Studio 项目文件。而且 - 正如您已经发现的那样 - EXCLUDE_FROM_ALLEXCLUDE_FROM_DEFAULT_BUILD 是按目标/项目或目录设置的。

    因此您可以使用ExternalProject_Add() 拆分/链接您的项目。由于Other_Related_Stuff 依赖于MainApplication,你应该在Other_Related_Stuff 的CMake 文件中调用ExternalProject_Add()

    所以我的建议是这样的:

    CMakeLists.txt

    project(Main)
    
    add_subdirectory(Library_A)
    
    add_executable(MainApplication ...)
    target_link_libraries(MainApplication PRIVATE Library_A)
    

    Other_Related_Stuff/CMakeLists.txt

    project(OtherRelatedStuff)
    
    ExternalProject_Add(
        MainApplication 
        SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/.. 
        PREFIX MainApplication
    )   
    add_custom_target(OtherTarget ... DEPENDS MainApplication)
    

    所以现在您的主要CMakeLists.txtOther_Related_Stuff/CMakeLists.txt,它确实在MainApplication 子目录中生成了您的第二个解决方案文件。

    参考

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-28
      • 1970-01-01
      • 1970-01-01
      • 2016-10-01
      • 2018-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多