我目前正在从 autotools 转换一个小型 C 项目至 CMake .
在旧的 configure.in
中,我使用以下行检查了每个头文件和库函数是否存在:
# Checks for header files
AC_HEADER_STDC
AC_CHECK_HEADERS([stdlib.h time.h math.h sys/stat.h errno.h unistd.h fcntl.h signal.h])
# Checks for library functions
AC_FUNC_FORK
AC_CHECK_FUNCS([time localtime mktime gmtime exit fork chdir atol signal])
AC_FUNC_STRFTIME
据我所知,许多 autotools 项目就是这样做的。
尽管编译器已经检查了必要的头文件并且链接器检查了库函数,但我的代码仍然需要在配置阶段完成这些检查以正确设置它的编译标志 #ifdef HAVE_FOOBAR
等等。
在这种情况下,使用 CMake 检查 header /函数的最佳做法是什么?
最佳答案
您可以直接使用 CHECK_FUNCTION_EXISTS
轻松移植它, CHECK_INCLUDE_FILE
, CHECK_TYPE_SIZE
等。另见 CMake_HowToDoPlatformChecks寻求一些建议。
以这种方式配置增加了可移植性(即您可以检查 ucontext.h
和 setjmp.h
并使用现有的,使用 修改您的代码# ifdef HAVE_UCONTEXT
或 #ifdef HAVE_SETJMP
)。
此外,当您分发应用程序时,您希望避免出现编译错误(对于用户),因此使用良好的构建系统,您可以在分发应用程序之前处理大部分架构差异。
非程序员更容易理解如果“check for gtk+ header - failed”,他们必须安装 gtk,而不是有一堆编译错误行说同样的事情,但对于大多数人来说是不可读的他们:)
关于c - 如何像在 Autotools 中一样检查 CMake 中的头文件和库函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/647892/