首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用CMake为某个目标创建C#定义?

如何使用CMake为某个目标创建C#定义?
EN

Stack Overflow用户
提问于 2011-03-18 20:39:03
回答 3查看 21.2K关注 0票数 19

我觉得现在有点傻。在最近将一些较小的项目转换为使用CMake之后,我决定也去掉一些"Platform_Config.h“文件。这些文件包含一些预处理指令,如#define USE_NEW_CACHE和控件编译。

我如何将这些定义‘转换’为CMake控制?理想情况下,通过使用这些“缓存”变量,用户可以轻松地进行编辑。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-03-18 22:54:46

有两种选择。您可以使用add_definitions方法将定义作为编译器标志进行传递:例如,在项目cmakelists.txt中的某个位置:

代码语言:javascript
复制
add_definitions( -DUSE_NEW_CACHE )

CMake将确保-D前缀转换为您的编译器的正确标志( msvc为/D,gcc为-D )。

或者,也可以查看configure_file。它比较复杂,但可能更适合使用Platform_Config文件的原始方法。

您可以创建一个输入文件,类似于您的原始Platform_Config.h,并在其中添加"#cmakedefine“行。

让我们调用Platform_Config.h.in:

代码语言:javascript
复制
// In Platform_Config.h.in
#cmakedefine USE_NEW_CACHE
// end of Platform_Config.h.in

然后运行时

代码语言:javascript
复制
configure_file( ${CMAKE_SOURCE_DIR}/Platform_Config.h.in ${CMAKE_BINARY_DIR}/common/Platform_Config.h )

它将在您的构建目录中生成一个新的Platform_Config文件。cmake中的变量也是cmakedefine,它们将出现在生成的文件中,其他变量将被注释掉或未定义。

当然,您应该确保在将实际生成的文件包含在源文件中时,能够正确地找到它。

票数 22
EN

Stack Overflow用户

发布于 2014-12-11 21:01:09

如果你想设置每个目标的定义:从2.8.11开始,你可以使用target_compile_definitions

在早期版本中,您可能不希望按原样使用set_target_properties,因为它会覆盖您先前设置的任何定义。请先调用get_target_property,然后再与以前的值合并。参见add_target_definitions here

票数 4
EN

Stack Overflow用户

发布于 2021-10-28 13:58:40

使用target_compile_options。不要引用您的定义,否则它不会被检测为定义。CMake解析/define并将实际的定义添加到csproj的DefineConstants部分,如果有引号,它会将整个带引号的字符串放入csproj的AdditionalOptions部分。

下面是我的一个项目中使用生成器表达式的示例:

代码语言:javascript
复制
target_compile_options( ${LIBRARY_NAME} PRIVATE
    $<${IS_ART_ITERATION_BUILD}:/define:ART_ITERATION_BUILD>
)

没有生成器表达式的示例:

代码语言:javascript
复制
target_compile_options( ${LIBRARY_NAME} PRIVATE
    /define:GRAPHICS_VULKAN
)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5352074

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档