CMake嵌套项目和目标
CMake Nested Projects and Targets
我在从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,而OtherRelatedtuff是主项目的一部分)。
现在:ALL_BUILD构建所有项目。
当我设置时
set_target_properties(OtherTarget PROPERTIES EXCLUDE_FROM_ALL 1 EXCLUDE_FROM_DEFAULT_BUILD 1)
在两个解决方案中,OtherTarget都被禁用了。
我想做的是:
解决方案1:
在Main.Sln
中,不应存在其他目标。在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
,所以应该在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.txt
是Other_Related_Stuff/CMakeLists.txt
,它确实在MainApplication
子目录中生成了第二个解决方案文件。
参考
- 具有多个可执行文件的CMake共享库
- CMake:防止在子目录库项目中生成测试可执行目标
- 无法为不是由该项目生成的目标指定链接库
- 如何为在 x86 主机上为 arm 目标交叉编译的项目安装依赖项
- CMake:如何更改子目录项目目标的属性?
- Cmake :几个使用自定义目标进行测试的项目
- 在QT中的大型项目中指定构建/目标/安装路径
- CMake 将目标作为项目的一部分独立构建
- 使用 CMake 外部项目为跨平台库依赖项的目标名称
- 如何使用于 catch2 测试和项目运行的 cmake 目标更具可扩展性和合理性?
- 如何获取外部项目定义的目标的输出路径?
- 使用解决方案上的msbuild来调用某些项目上的自定义目标
- qtmake-两个项目/目标之间的共享资源
- Cmake:将子项目目标导出到主项目
- 在使用 Xbuild 编译 Visual C++ 项目时定义目标
- 在目标 c 项目中包含 cpp 类的逻辑
- EclipseCDT-带有现有代码的新Makefile项目-更改全局默认构建目标
- Qt创建者中的通用c++项目-没有使目标成为目标的规则
- CMake嵌套项目和目标
- 使用opencv框架的目标C项目的最佳编译器标志
- 如何在目标项目 (cmake) 中添加不用于创建目标的文件