簡體   English   中英

如何檢查cmake給定的頭文件是否可用於C ++項目

[英]How to check in cmake whether a given header file is available for C++ project

我正在使用cmake來管理我項目的編譯,這是我第一次使用cmake。 這個工具非常方便,因為有太多的腳本和函數可以檢查給定計算機上是否安裝了所有必需的庫。 但是,有時這些通用的sripts不包含某些特定情況,或者它們根本不適用於給定的庫。 我的問題如下:

什么是正確的cmake風格的方式來判斷給定的頭文件(hpp或h)是否在包含路徑中可用?

理由:

最直接的方法可能是使用CHECK_INCLUDE_FILE宏。 例如,如果我想使用UnitTest ++庫,我可以寫

CHECK_INCLUDE_FILE_CXX("UnitTest++.h" HAVE_UNITTESTXX)
IF(NOT HAVE_UNITTESTXX)
  message( FATAL_ERROR "UnitTest++ is not found" )
ENDIF()

不幸的是,如果以這種方式完成,變量HAVE_UNITTESTXX將存儲在緩存中。 如果我在我的系統中安裝UnitTest ++庫,cmake仍然會抱怨UnitTest ++。我沒有安裝。 我可以手動刪除緩存,但標准的查找包函數不需要。 我也可以像這樣升級代碼

CHECK_INCLUDE_FILE_CXX("UnitTest++.h" HAVE_UNITTESTXX)
IF(NOT HAVE_UNITTESTXX)
  UNSET(HAVE_UNITTESTXX CACHE)
  message( FATAL_ERROR "UnitTest++ is not found" )
ENDIF()

這個解決方案有效,但看起來並不好看。 我想知道一種cmake方式來完成這項任務。

最好的祝福!

您正在尋找的答案已經在CMake Wiki上 他們清楚地告訴您刪除文件CMakeCache.txt或手動困擾您的緩存行。

不幸的是,沒有更簡潔的方法來做到這一點。 你的已經盡可能好了。 我認為當一切正常時,CMake會嘗試方便,因此緩存,並試圖強制您在失敗時刪除並重新生成它。

另一方面,您可以編寫CHECK_INCLUDE_FILE_CXX_ERROR宏(或任何清理程序名稱)來包裝致命錯誤消息,這樣您就不必每次都重復相同的代碼:

macro(CHECK_INCLUDE_FILE_CXX_ERROR INCLUDE_FILE HAVE_FILE)
    CHECK_INCLUDE_FILE_CXX(${INCLUDE_FILE} ${HAVE_FILE})
    IF(NOT ${HAVE_FILE})
        UNSET(HAVE_UNITTESTXX CACHE)
        message( FATAL_ERROR "${INCLUDE_FILE} is not found" )
    ENDIF()
endmacro()

然后像這樣使用它:

CHECK_INCLUDE_FILE_CXX_ERROR("UnitTest++.h" HAVE_UNITTESTXX)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM