我目前正在将一个小型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
许多autotools项目都是AFAIK。
尽管编译器已经检查了必要的头文件并且链接器检查了库函数,但我的代码仍然需要在配置阶段完成这些检查,以正确设置#ifdef HAVE_FOOBAR
等的编译标志。
在这种情况下,使用CMake检查标头/功能的最佳做法是什么?
答案 0 :(得分:13)
您可以使用CHECK_FUNCTION_EXISTS
,CHECK_INCLUDE_FILE
,CHECK_TYPE_SIZE
等直接轻松移植它。另请参阅CMake_HowToDoPlatformChecks以获取一些建议。
使用此样式进行配置可添加可移植性(即,您可以检查ucontext.h
和setjmp.h
并使用现有的,使用#ifdef HAVE_UCONTEXT
或#ifdef HAVE_SETJMP
修改代码。< / p>
此外,当您分发应用程序时,您希望避免编译错误(对于用户而言),因此使用良好的构建系统,您可以在分发应用程序之前处理大多数架构差异。
非程序员更容易理解,如果“检查gtk + header - failed”,他们必须安装gtk,而不是有一大堆编译错误行说同样的东西,但大部分都不可读他们:))