在CMake中,是否有一种方法可以设置给定目标具有链接依赖关系的所有目标的属性?

1rhkuytd  于 2023-03-02  发布在  其他
关注(0)|答案(1)|浏览(162)

在CMake中,我们可以将目标属性设置为PRIVATEPUBLICINTERFACEPUBLICINTERFACE属性都可以由依赖于当前目标的任何目标继承。(即由当前目标的依赖性继承)。
大多数链接器/编译器要求所有链接目标的某些属性(例如exception handling model)具有相同的值。如果我们想更改可执行文件的其中一个属性,则需要在其所有依赖项上设置该属性。通常,这些依赖项是代码中的子模块,我们无法针对特定用例修改它们的CMakeLists.txt文件。这留给我们两个选择:
1.设置一个全局属性(例如,CMAKE_CXX_FLAGS或add_compile_options),该属性将传播到任何子目录中的所有目标,而不管它们是否为依赖关系。
1.使用target_compile_options显式设置每个从属目标的属性。根据依赖关系的数量,这会变得过多和重复。
如果有一个功能可以将属性只传递给依赖目标,而不必单独指定它们,那就太好了。有人知道如何做到这一点吗?

qv7cva1a

qv7cva1a1#

对于编译器标志的情况,* 必须 * 对整个程序一致(包括动态链接的部分),比如MSVC的异常处理模型,我觉得set-something-global的方法比较合适,对我来说,它看起来很实用,而且比逐个向每个第三方目标添加标志稍微健壮一些(例如,如果您忘记处理一个目标,或者如果在新版本中添加或删除第三方目标,这似乎是人为错误的成熟机会)。
设置环境变量[CMAKE_<LANG>_FLAGS]是一个很好的开始。如果您正在通过ExternalProject构建外部项目,则可能需要做更多的工作。
对于异常处理模型等设置,需要注意一点:您可能会尝试在项目的CMake文件中硬编码此全局设置。如果您的项目被其他人使用,而不仅仅是您或您的公司,特别是如果它的主要组件是库而不是可执行文件,最好不要这样做。不要剥夺用户选择类似内容的能力(除非出于某种原因,您的库 * 需要 * 某种异常处理模型,在这种情况下,我仍然会让他们设置这个全局设置,提供说明这一点的文档,并考虑在用户不遵守时发出CMake警告)。使用像CMake presets这样的特性,或者只设置它if the project is the top-level project
有趣的附注:CMake当前默认为MSVC构建全局“硬编码”/EHscHere's the ticket discussing this

相关问题