roa*_*ter 5 c++ cmake visual-studio visual-studio-2012
我在从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)
Run Code Online (Sandbox Code Playgroud)
现在,使用Visual Studio生成器,我们将获得两个解决方案文件。那是正确的。在这两个解决方案中,我们都有这三个项目(因为OtherReleatedStuff取决于所构建的MainApplication beeing,而OtherRelatedStuff是Main-Project的一部分)。
现在:ALL_BUILD生成所有项目。
当我设定
set_target_properties(OtherTarget PROPERTIES EXCLUDE_FROM_ALL 1 EXCLUDE_FROM_DEFAULT_BUILD 1)
Run Code Online (Sandbox Code Playgroud)
...在两种解决方案中,OtherTarget均已禁用。
我想做的是:
解决方案1: 在Main.Sln中不应存在 OtherTarget。在 OtherRelatedStuff.sln中可能有MainApplication,但不应构建。也许也不应该有MainApplication。
解决方案2: 在Main.Sln中,永远不要构建OtherTarget(从构建中排除)。在OtherRelatedStuff.sln中,应该构建OtherTarget,但是依赖项不可见甚至不可见。
有解决方案吗?
在一个CMakeLists.txt源树中找到的所有目标都将生成一个 Visual Studio 项目文件。并且 - 正如您已经发现的那样 -EXCLUDE_FROM_ALL并且EXCLUDE_FROM_DEFAULT_BUILD是按目标/项目或目录设置的。
因此,您可以使用ExternalProject_Add(). 而且,由于Other_Related_Stuff依赖于MainApplication你应该叫ExternalProject_Add()中Other_Related_Stuff的CMake的文件。
所以我的建议是这样的:
CMakeLists.txt
project(Main)
add_subdirectory(Library_A)
add_executable(MainApplication ...)
target_link_libraries(MainApplication PRIVATE Library_A)
Run Code Online (Sandbox Code Playgroud)
Other_Related_Stuff/CMakeLists.txt
project(OtherRelatedStuff)
ExternalProject_Add(
MainApplication
SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/..
PREFIX MainApplication
)
add_custom_target(OtherTarget ... DEPENDS MainApplication)
Run Code Online (Sandbox Code Playgroud)
所以现在您的主要内容CMakeLists.txt是Other_Related_Stuff/CMakeLists.txt,它确实在MainApplication子目录中生成了您的第二个解决方案文件。
参考