【问题标题】:Passing variables down to subdirectory only仅将变量传递到子目录
【发布时间】:2015-09-08 05:10:04
【问题描述】:

如何将项目特定变量传递到子目录?我想知道是否有这样做的“官方”方式:

# (CMAKE_BUILD_TYPE is one of None, Debug, Release, RelWithDebInfo)

# ...

# set specific build type for 'my_library'
set( CMAKE_BUILD_TYPE_COPY "${CMAKE_BUILD_TYPE}" )
set( CMAKE_BUILD_TYPE "Release" )
add_subdirectory( "my_library" )
set( CMAKE_BUILD_TYPE ${CMAKE_BUILD_TYPE_COPY} )

# continue with original build type
# ...

库/子目录my_library 应始终使用"Release" 类型构建,主项目和其他子目录应使用配置定义的类型构建。我无法修改CMakeLists.txtmy_library

【问题讨论】:

  • 关于set(CMAKE_BUILD_TYPE Release)stackoverflow.com/a/24470998/2288008
  • 你的问题是将不同的标志传递给不同的目录?
  • 更多细节见@ruslo评论/链接。只是想补充一点——如果我们谈论的是 VS——你在打开生成的 VS 解决方案时在“配置管理器”中看到的内容被硬编码到 VS 生成器中。见cmVisualStudio10TargetGenerator.cxx。项目的配置将始终与解决方案的配置相匹配。我建议将my_library 生成为external project
  • @coincoin:不,我的项目使用外部库,它们是 git 子模块。这些有自己的CMakeLists.txt,所以我无法修改这些。我希望将其中一个库构建为Release,因为这是一个非常重的 OpenGL 库。但我想在我自己的代码中调试符号,即Debug
  • @ruslo:感谢您的链接。这意味着我不应该将CMAKE_BUILD_TYPE 传递给其他 cmake 目录。我的问题仍然悬而未决;如何在不更改当前CMakeLists.txt 的值的情况下以一种不错的方式传递不同的值。

标签: cmake


【解决方案1】:

在您的评论中回答修改后的问题(我怎样才能传递 不同的 值),所以除了 CMAKE_BUILD_TYPE` 以外的值:

没有额外的机器。如果变量是特定于项目的,您只需设置变量:

    set(MYLIB_SOME_OPTION OFF)
    add_subdirectory(mylib)

如果它更一般,你需要恢复它:

    set(BUILD_SHARED_LIBS_SAVED "${BUILD_SHARED_LIBS}")
    set(BUILD_SHARED_LIBS OFF)
    add_subdirectory(mylib)
    set(BUILD_SHARED_LIBS "${BUILD_SHARED_LIBS_SAVED}")

或者你可以把它放到一个函数中,你不需要恢复你改变的变量,因为函数有一个范围。

【讨论】:

  • 嗯,它将在函数中可见,然后可以将其转发到调用范围。但你是对的,如果子目录为 PARENT_SCOPE 设置了一个变量,那么不使用函数会更简单,但上面的“更通用”示例
  • @tamas.kenez:鉴于“没有额外的机制”是真的,你的回答被接受了。
  • 嗨,如何可以使用主 CMakeLists.txt 中定义的选项并使用子目录 CMakeList.txt 中的变量名?
  • 所以你可以从函数中调用“add_subdirectory”并在那里设置变量?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-13
  • 2018-06-02
  • 2018-03-23
  • 2014-01-22
  • 2018-07-05
  • 1970-01-01
相关资源
最近更新 更多