Sta*_*ine 6 c++ linux time cmake
我希望一些顽固的Linux可以回答我在使用时间函数时应如何编写可移植(POSIX)代码。
一些SO线程建议,在编写C ++代码时,包括ctime是正确的做法,而对于C代码,您仍将包括time.h。但是,它们都定义了相同的功能,尽管它们是在不同的命名空间中。从技术上讲,您应该可以同时指定两者。
一位SO帖子建议应避免使用基于sys / *的内容。
..虽然该线程暗示必须在包含sys / resources.h之前包含sys / time.h,尤其是对于基于BSD的平台。
这篇文章说包含sys / time.h改善了可移植性。我认为发布者认为它允许您链接更多使用诸如gettimeofday之类的特定功能的第三方库。
函数gettimeofday()已气馁,现在正在享受弃用的状态,所以我应该使用clock_gettime()代替。这个clock_gettime()在time.h中定义,请参阅https://linux.die.net/man/3/clock_gettime ..
..如果安装并与libavutil链接(例如,作为ffmpeg-dev的一部分),则可以很清楚地发现创建了time.h可以使人们发疯。Ffmpeg(和其他一些库)具有自己的time.h,甚至timeb.h。事实证明,如果构建堆栈中任何地方的任何.c或.cpp都包含一个 time.h,且包含路径包含多个有效条目(包括ffmpeg的条目),则它可能引用错误的条目,并且声明只需替换。@ FFmpeg,理由似乎是丑陋的骇客足以解决问题。我还没有那么幸运。而且,对所有源进行Php量化听起来根本不是一个解决方案。
我的系统上的usr / include / i386-linux-gnu / bits中存在另一个time.h,因此这也不是仅限ffmpeg的现象。因此,简单地将usr / include / i386-linux-gnu称为include路径就变得很致命,这在引用系统include时很奇怪。
我重写了我的CMake脚本,注意对大多数目标使用专用的include文件夹规范。我试过在整个代码库中引用的预编译标头中包含各种time.h / ctime和sys / time.h排列。我仍然收到类似的错误:
错误:字段“ st_atim”的类型“ timespec”不完整,结构timespec st_atim;
错误:尚未声明“ :: time”
等等..
因此,对于链接了许多第三方依赖关系的C ++安装程序,确保所有内容(包括time.h)保持编译的正确方法是什么?我应该将time.h include包含在我要编译到的特定平台上吗?我应该检查所有可能需要time.h的目标吗?前方摆着跳舞的大象和五彩纸屑。
更新:该问题似乎与C ++的版本有关,如下面的评论所暗示。从那以后,我已经将gcc从5.4更新到8.3.0,并且我放弃了在Linux上低于c ++ 11的较旧c ++兼容性的支持。在更新并重建了所有第3方软件包(包括ffmpeg)之后,我现在不再遇到我描述的问题,但这并不意味着它已被修复,因为它不会对其他人再次出现。实际上,我认为问题主要在于ffmpeg如何在较旧的编译器上进行编译,并且没有明确要求c ++ 11,因此我将其保留为开放状态。
我建议您考虑date
下一版C++
标准库(C++20
)已接受的Howard Hinnant 库:
https://github.com/HowardHinnant/date
它应该可以在任何支持此功能的平台上运行C++11
。
标准版本记录在这里:https : //en.cppreference.com/w/cpp/chrono