包含来自glibc的头文件

包含来自glibc的头文件

问题描述:

我发现了一个严重的瓶颈 - 我的项目中大约有四分之一的执行时间浪费在tzset函数中(由mktime调用)。包含来自glibc的头文件

我检查tzset sources(代码,从行378起),发现设置TZ环境变量,如果一旦将大大减少它的执行时间,因为它(在我的OS例如/usr/local/etc/zoneinfo)读取时区文件TZ环境变量未设置。

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

#include <timezone/tzfile.h> 

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

+0

你有两个基本的选择。添加到你的'configure'脚本中(你知道如何编写'autoconf'脚本 - 这对任何在非专有POSIX操作系统上开发的人来说都是必备的技能 - 对吗?固定的一组位置,并使用它来编译运行时常量。或者,从运行应用程序之前必须设置的某个环境变量中获取位置。这种情况实际上是'autoconf'和GNU工具链的其余部分的设计目的。 –

+0

“使用自动工具”对于询问如何在CMake中执行某些操作的人不是有用的答案。 –

您需要在您的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)