如何从一个配置中排除CMake目标?

时间:2013-03-06 20:27:38

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

我最近在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执行此操作?

2 个答案:

答案 0 :(得分:6)

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

SET_TARGET_PROPERTIES(mymodule PROPERTIES EXCLUDE_FROM_DEFAULT_BUILD_DEBUG True)

答案 1 :(得分:4)

您不能将目标排除在配置之外,但由于源代码的条件编译,您可以拥有一个空(或几乎为空)的库。您可以使用“optimize”和“debug”关键字以特定于配置的方式链接到另一个库到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

然后,您可以指定您只使用target_link_libraries的“optimized”关键字链接到Release版本中的libVendor,如下所示:

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

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