包含glibc的标题

时间:2017-10-12 13:29:02

标签: c cmake include glibc

我在我的项目中发现了一个严重的瓶颈 - tzset函数浪费了大约四分之一的总执行时间(由mktime调用)。

我检查了tzset sources(代码,从第378行开始),发现设置 TZ 环境变量一次会大大减少执行时间,因为它会读取一个时区文件(例如如果 TZ 环境变量未设置,则在我的操作系统中/usr/local/etc/zoneinfo

我会读取此文件并设置环境变量,但文件的位置可能因不同的平面图而异。所以,我要做的是以某种方式重用代码tzset用于这些目的。 这可能看起来很简单,只需包含标题tzset用于查找和检索时区信息,并使用此功能:)

#include <timezone/tzfile.h>

但我真的不知道该怎么做,我的意思是使用glibc标头。编译器不知道这个标题(我的IDE,Clion,也没有看到它)。我真的坚持这个。

1 个答案:

答案 0 :(得分:1)

您需要在CMakeLists.txt中为tzinfo.h添加platform check。例如:

INCLUDE (CheckIncludeFiles)
# usage: CHECK_INCLUDE_FILES (<possible header locations> <RESULT_VARIABLE> )

if (${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
  CHECK_INCLUDE_FILES("timezone/tzfile.h;sys/tzfile.h" HAVE_TZFILE_H)
endif(${CMAKE_SYSTEM_NAME} STREQUAL "Linux")

然后,您可以使用#ifdef HAVE_TZFILE_H

如果您不担心验证文件的内容,您也可以使用FIND_FILE而不是更快。 (CheckIncludeFiles实际上使用了一个小的.c文件,#include是尝试编译它的标题。)

find_file (<VAR> NAMES name PATHS paths... NO_DEFAULT_PATH)