2013-03-06 21 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) 
相關問題