【问题标题】:How do you exclude a CMake target from just one configuration?如何从一种配置中排除 CMake 目标?
【发布时间】:2013-02-21 19:57:54
【问题描述】:

我最近向 CMake 项目添加了一个模块,该模块依赖于我仅针对发布 CRT 编译的库。在 CMakeLists.txt 中是这样的:

IF(WIN32)
    ADD_LIBRARY(mymodule MODULE ${MY_LIBRARY_FILES})
    TARGET_LINK_LIBRARIES(mymodule libVendor)
    INSTALL(TARGETS mymodule LIBRARY)
ENDIF(WIN32)

如果我尝试在 MSVC 中使用调试设置编译此模块,则编译失败。所以我想要做的就是在调试配置中排除它被编译和安装。在发布配置中,它将照常使用。用 CMake 可以做到这一点吗?

【问题讨论】:

    标签: c++ visual-c++ cmake


    【解决方案1】:

    您还可以在特定配置中从默认构建中排除目标:

    SET_TARGET_PROPERTIES(mymodule PROPERTIES EXCLUDE_FROM_DEFAULT_BUILD_DEBUG True)
    

    【讨论】:

      【解决方案2】:

      您不能有一个被排除在配置之外的目标,但您可以有一个由于源代码的条件编译而为空(或几乎为空)的库。您可以使用 target_link_libraries 的“优化”和“调试”关键字以特定配置的方式链接到另一个库。

      例如,在您的库源文件中,您可以这样做:

      #ifdef _DEBUG
      // ... Debug code, possibly just a dummy function if necessary, goes here
      #else
      // ... Release code, the real deal, goes here
      #endif
      

      然后,您可以指定您只链接到发布版本中的 libVendor,方法是使用 target_link_libraries 的“优化”关键字,如下所示:

      if(WIN32)
        add_library(mymodule ...)
        target_link_libraries(mymodule optimized libVendor)
        install(TARGETS mymodule LIBRARY)
      endif()
      

      target_link_libraries documentation 解释了这些关键字的使用,还提到您可以定义 IMPORTED 目标以实现按配置效果。但是,为了定义 IMPORTED 目标,库文件必须已经构建,并且您必须指向它们。所以...条件编译可能是做你想做的最简单的方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-04
        • 1970-01-01
        相关资源
        最近更新 更多