wpf*_*oop 7 c c++ cmake include
我正在使用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()
Run Code Online (Sandbox Code Playgroud)
不幸的是,如果以这种方式完成,变量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()
Run Code Online (Sandbox Code Playgroud)
这个解决方案有效,但看起来并不好看.我想知道一种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()
Run Code Online (Sandbox Code Playgroud)
然后像这样使用它:
CHECK_INCLUDE_FILE_CXX_ERROR("UnitTest++.h" HAVE_UNITTESTXX)
Run Code Online (Sandbox Code Playgroud)