我最近在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执行此操作?
答案 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目标,必须已经构建了库文件,并且您必须指向它们。所以......条件编译可能是你想做的最简单的方法。