4

我最近向 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 做到这一点吗?

4

2 回答 2

8

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

SET_TARGET_PROPERTIES(mymodule PROPERTIES EXCLUDE_FROM_DEFAULT_BUILD_DEBUG True)
于 2013-08-29T14:39:22.633 回答
4

您不能有一个被排除在配置之外的目标,但是您可以有一个由于源代码的条件编译而为空(或几乎为空)的库。您可以使用 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 的“优化”关键字来指定仅链接到发布版本中的 libVendor,如下所示:

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

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

于 2013-03-07T05:00:03.503 回答