我在从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 beeing构建,而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应该构建,但依赖关系不应该或甚至应该可见。
有解决方案吗?
答案 0 :(得分:3)
在一个CMakeLists.txt
源树中找到的所有目标都将生成一个Visual Studio项目文件。而且 - 正如您已经发现的那样 - 每个目标/项目或目录都设置了EXCLUDE_FROM_ALL
和EXCLUDE_FROM_DEFAULT_BUILD
。
因此,您可以使用ExternalProject_Add()
拆分/链接项目。由于Other_Related_Stuff
取决于MainApplication
,因此您应该在ExternalProject_Add()
的CMake文件中致电Other_Related_Stuff
。
所以我的推荐看起来像这样:
<强>的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.txt
为Other_Related_Stuff/CMakeLists.txt
,它会在MainApplication
子目录中生成您的第二个解决方案文件。
<强>参考强>