2013-03-06 23 views
4

我最近在一个CMake项目中添加了一个模块,这个模块取决于我只在发布CRT时编译过的库。它看起来像这样的CMakeLists.txt:如何从一个配置中排除CMake目标?

IF(WIN32) 
    ADD_LIBRARY(mymodule MODULE ${MY_LIBRARY_FILES}) 
    TARGET_LINK_LIBRARIES(mymodule libVendor) 
    INSTALL(TARGETS mymodule LIBRARY) 
ENDIF(WIN32) 

如果我尝试编译此模块中MSVC与调试设置,编译失败。所以我想要做的就是将它排除在调试配置中编译和安装。在发布配置中,它将被正常使用。 CMake可以做到这一点吗?

回答

3

您不能有一个目标不在配置之外,但由于其源代码的条件编译,您可以拥有一个空(或接近空)的库。您可以使用“优化”和“调试”关键字以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 

然后,您可以指定要使用的“优化”的关键字,你只能链接到libVendor在发布版本, target_link_libraries,像这样:

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

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

+0

该诀窍。谢谢! – Brian 2013-03-07 18:11:54

4

什么你也可以做的是排除默认的构建目标在一定的配置:

SET_TARGET_PROPERTIES(mymodule PROPERTIES EXCLUDE_FROM_DEFAULT_BUILD_DEBUG True) 
相关问题