如何在cmake中检查给定的头文件是否可用于c++项目
How to check in cmake whether a given header file is available for C++ project
我使用cmake来管理我的项目编译,这是我第一次使用cmake。这个工具非常方便,因为有大量的脚本和函数可以检查是否在给定的计算机上安装了所有必要的库。然而,有时,这些通用脚本不涵盖某些特定情况,或者对于给定的库根本不可用。我的问题是:
判断给定头文件(hpp或h)是否在包含路径中可用的正确cmake样式方法是什么?
的理由:最直接的方法可能是使用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++ .h。我可以手动删除缓存,但标准的查找包函数不需要这样做。我还可以像这样升级代码
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 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)
相关文章:
- 在 Windows 上,是否可以让 dll 在不使用 PATH 环境变量的情况下在另一个文件夹中查找依赖项?
- 在设计 SDK 时,我是否应该在 C++ 头文件中完全隐藏内部类?
- 给定一个C++嵌套的私有结构类型,是否有从文件范围静态函数访问它的策略
- 如何将 UTF-8 文本从文件转换为某个可以迭代的容器,并检查每个符号是否为C++字母数字?
- 如何检查函数是否在LLVM Instrumentation pass的ModulePass的系统头文件中定义?
- 是否可以在没有真实文件的情况下创建 ifstream
- 是否可以使用 libclang python 解析 cpp 文件中没有标头的函数原型
- 在C++中使用没有合作伙伴Class/Cpp文件的头文件是否实用
- 是否可以使用 Python csv 阅读器读取使用 C++ std::setw 生成的文件?
- 内联函数的函数本地静态对象是否在共享对象文件之间共享?
- 是否可以在命令行中将输入参数传递给可执行文件
- 在头文件上包含 cpp 文件是否有缺点?
- 如果包含映射的静态库与可执行文件和动态库链接,静态映射(变量)是否会被多次释放?
- 是否可以在文本文件中找到最长单词的长度,并在同一个文本文件中读取,只需 1 个 while 循环?
- 对同一文件使用 .read 的次数是否有限制?
- 如何检查流中文件的下一个单词是否为 alpha?
- 文件模式标志"ios::app"是否用于删除文件(如果文件已存在)?
- 使用 #include 将大量重复代码放入单独的文件中是否可以和/或正常?
- 如何检查文件是否已存在于 fstream C++中
- 是否有正确的方法对生成文件中的对象文件使用模板命令?(C++)