在我们的项目中,我们根据所选配置设置CMAKE_SYSROOT
。之所以如此,是因为配置(其中包括)表示目标平台(交叉编译-不仅如此,而且行为上也有细微差别)。
我们想用generator expression表示这一点,以便对多配置IDE友好。
但是,我们还没有找到一种方法。首先,您会注意到CMAKE_SYSROOT
甚至都没有提到这种可能性。我们仍然尝试将其设置为这样的值(不是精确值-只是一个示例!):
set(CMAKE_SYSROOT $<IF:$<CONFIG:hw1>,path1,path2>)
希望在支持generator expressions的上下文中使用该值。但显然不是。相反,似乎在--sysroot
参数(--sysroot="\$<IF:\$<CONFIG:hw1>,path1,path2>"
)中提供了逐字值。在值周围添加引号不会改变任何内容。
我们还有其他选择吗?
我还要在CMAKE_TOOLCHAIN_FILE
的文档中提到的CMAKE_SYSROOT
上添加注释。
在grep
和cmake -DCMAKE_BUILD_TYPE=hw1 ../
生成的文件以及我们自己的来源中,CMAKE_TOOLCHAIN_FILE
并没有设置为任何东西。
显然,CMAKE_SYSROOT
没有指向我们设置CMAKE_TOOLCHAIN_FILE
的文件。但是,--sysroot
参数仍设置为期望值。 (只有generator expression才行!)因此,它确实可以以某种方式起作用。
我希望其他变量也会遇到相同的问题:
无论如何(在我们的例子中),最后两个依赖于CMAKE_SYSROOT
。
答案 0 :(得分:3)
如果您真的想将不同的--sysroot
标志传递给多配置生成器上的链接器,则只需使用生成器表达式通过target_link_options
来传递它。但是,那么您可能必须自己更新rpath
个项目,但是我不确定。
在构建时不使用变量,并且生成器表达式的文档规定:
Generator expressions are allowed in the context of many target properties...
在set
命令中没有看到任何阻止将CMAKE_SYSROOT
设置在工具链文件之外的内容。我猜短语This variable may only be set in a toolchain file
应该是This variable is normally used in a toolchain file
。
似乎您正在尝试使用构建类型作为两个不同工具链之间的切换。如果是这种情况,那么我看不到如何使用多配置生成器正常工作。您要设置的大部分内容都是在配置时确定的,而不是在构建时使用的。