gpt4 book ai didi

c++ - CMake 嵌套项目和目标

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:01:12 25 4
gpt4 key购买 nike

我在从 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 生成器,我们得到两个解决方案文件。这是正确的。在这两个解决方案中,我们都有这三个项目(因为 OtherRelatedStuff 依赖于正在构建的 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 应该构建,但依赖项不可见或什至不应该可见。

有解决办法吗?

最佳答案

在一个 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 子目录中生成您的第二个解决方案文件。

引用

关于c++ - CMake 嵌套项目和目标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33522541/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com