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

6

我最近在一个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个回答

10
您还可以在特定配置中从默认构建中排除目标:
SET_TARGET_PROPERTIES(mymodule PROPERTIES EXCLUDE_FROM_DEFAULT_BUILD_DEBUG True)

1
注意:如果您不使用Visual Studio生成器(与Brian不同),则此内容不适用于您。 - starball

4

您不能在配置中省略目标,但是由于源代码的条件编译,您可以拥有一个空(或几乎为空)的库。并且您可以使用 "optimized" 和 "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文档解释了这些关键字的使用,还提到您可以定义IMPORTED targets以实现每个配置效果。但是,要定义IMPORTED targets,库文件必须已经构建好,并且必须指向它们。所以……条件编译可能是实现您想要做的事情最简单的方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接