16

我目前正在将一个小型 C 项目从autotools转换为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

这是许多自动工具项目所做的 AFAIK。

尽管编译器已经检查了必要的头文件并且链接器检查了库函数,但我的代码仍然需要在配置阶段完成这些检查才能正确设置它的编译标志#ifdef HAVE_FOOBAR等。

在这种情况下,使用 CMake 检查标头/函数的最佳做法是什么?

4

1 回答 1

13

您可以轻松地直接使用CHECK_FUNCTION_EXISTSCHECK_INCLUDE_FILECHECK_TYPE_SIZE等进行移植。另请参阅CMake_HowToDoPlatformChecks以获得一些建议。


以这种方式进行配置增加了可移植性(即,您可以检查ucontext.hsetjmp.h使用现有的,用#ifdef HAVE_UCONTEXTor修改您的代码#ifdef HAVE_SETJMP)。

此外,当您分发应用程序时,您希望避免出现编译错误(对于用户而言),因此通过良好的构建系统,您可以在分发应用程序之前处理大部分架构差异。

非程序员更容易理解,如果“检查 gtk+ 标头 - 失败”,他们必须安装 gtk,而不是有一堆编译错误行说同样的事情,但对他们中的大多数人来说是不可读的 :)

于 2009-03-17T08:43:35.343 回答