我目前正在将一个小型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检查标头/功能的最佳做法是什么?
您可以轻松地将直接与CHECK_FUNCTION_EXISTS
,CHECK_INCLUDE_FILE
,CHECK_TYPE_SIZE
等.另见CMake_HowToDoPlatformChecks一些建议.
在这种风格的配置增加了便携性(即你可以检查ucontext.h
和setjmp.h
,并使用一个当前,随着修改代码#ifdef HAVE_UCONTEXT
或#ifdef HAVE_SETJMP
).
此外,当您分发应用程序时,您希望避免编译错误(对于用户),因此使用良好的构建系统,您可以在分发应用程序之前处理大多数体系结构差异.
非程序员更容易理解,如果"检查gtk +头 - 失败",他们必须安装gtk,而不是有一大堆编译错误行说同样的事情,但大多数人都无法读取:)