包含来自glibc的头文件
问题描述:
我发现了一个严重的瓶颈 - 我的项目中大约有四分之一的执行时间浪费在tzset
函数中(由mktime
调用)。包含来自glibc的头文件
我检查tzset sources(代码,从行378起),发现设置TZ环境变量,如果一旦将大大减少它的执行时间,因为它(在我的OS例如/usr/local/etc/zoneinfo
)读取时区文件TZ环境变量未设置。
我会读这个文件并设置环境变量,但文件的位置可能会因不同的平面图而有所不同。所以,我要做的是以某种方式重用代码tzset
用于这些目的。 这看似简单,只需包含头tzset
用于定位和检索时区信息,并使用此功能:)
#include <timezone/tzfile.h>
,但我真的不知道该怎么做了,我的意思是使用glibc的头。编译器不知道这个头(我的IDE,Clion,也没有看到它)。我真的坚持这一点。
答
您需要在您的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)
你有两个基本的选择。添加到你的'configure'脚本中(你知道如何编写'autoconf'脚本 - 这对任何在非专有POSIX操作系统上开发的人来说都是必备的技能 - 对吗?固定的一组位置,并使用它来编译运行时常量。或者,从运行应用程序之前必须设置的某个环境变量中获取位置。这种情况实际上是'autoconf'和GNU工具链的其余部分的设计目的。 –
“使用自动工具”对于询问如何在CMake中执行某些操作的人不是有用的答案。 –