Bri*_*ian 4 c++ cmake visual-c++
我最近在CMake项目中添加了一个模块,该模块依赖于我只针对发行版CRT编译的库.在CMakeLists.txt中看起来像这样:
IF(WIN32)
ADD_LIBRARY(mymodule MODULE ${MY_LIBRARY_FILES})
TARGET_LINK_LIBRARIES(mymodule libVendor)
INSTALL(TARGETS mymodule LIBRARY)
ENDIF(WIN32)
Run Code Online (Sandbox Code Playgroud)
如果我尝试使用调试设置在MSVC中编译此模块,则编译失败.所以我想要做的是将它排除在编译和安装在调试配置中.在发布配置中,它将正常使用.用CMake可以做到这一点吗?
您还可以做的是从特定配置中的默认构建中排除目标:
SET_TARGET_PROPERTIES(mymodule PROPERTIES EXCLUDE_FROM_DEFAULT_BUILD_DEBUG True)
Run Code Online (Sandbox Code Playgroud)
您不能将目标排除在配置之外,但由于其源代码的条件编译,您可以拥有一个空(或几乎空)的库。您可以使用 target_link_libraries 的“optimized”和“debug”关键字以配置特定的方式链接到另一个库。
例如,在库源文件中,您可以执行以下操作:
#ifdef _DEBUG
// ... Debug code, possibly just a dummy function if necessary, goes here
#else
// ... Release code, the real deal, goes here
#endif
Run Code Online (Sandbox Code Playgroud)
然后,您可以通过使用 target_link_libraries 的“optimized”关键字来指定仅链接到 Release 版本中的 libVendor,如下所示:
if(WIN32)
add_library(mymodule ...)
target_link_libraries(mymodule optimized libVendor)
install(TARGETS mymodule LIBRARY)
endif()
Run Code Online (Sandbox Code Playgroud)
target_link_libraries文档解释了这些关键字的用法,并且还提到您可以定义 IMPORTED 目标来实现每个配置的效果。但是,为了定义 IMPORTED 目标,库文件必须已经构建,并且您必须指向它们。所以...条件编译可能是做你想做的事情的最简单的方法。