为什么 `timespec_get()` 在 MinGW gcc 8.2.0 `-std=c11` 中不受支持?

6

涉及到日期为2011年4月12日的N1570 ISO/IEC 9899:201x编程语言-C委员会草案,应该有一个函数timespec_get()(见7.27.2.5)。

但是,MinGW gcc版本8.2.0在使用gcc -std=c11 snippet.c编译以下代码片段时返回warning: implicit declaration of function 'timespec_get'error: 'TIME_UTC' undeclared

#include <time.h>

int main() {
   struct timespec tstart;
   timespec_get(&tstart, TIME_UTC);
   return 0;
}

为什么呢?

1
我在Linux中也找不到那个函数。 - user3629249
1
这取决于你的C库而不是你的编译器。一些系统在支持最新版本的C方面声名狼藉,哈哈。 - Jens Gustedt
我自己11个月后仍然遇到这个完全相同的问题。 - James Oswald
MinGW-w64版本构建为UCRT确实具有timespec_getTIME_UTC。您可以从https://winlibs.com/获取最新的MinGW-w64 UCRT版本。 - Brecht Sanders
1个回答

0
除了使用-std=c11选项外,你还应该在编译器中使用-D_UCRT选项,并在链接器中使用-lucrt选项。 这里有一个可工作的CMakeLists.txt文件和cmake调用。
$ cat CMakeLists.txt 
cmake_minimum_required (VERSION 3.10)
project(timespec_get)

set(EXE_NAME test)
set(MAIN_SOURCES 
    ${PROJECT_SOURCE_DIR}/src/test.c
)

add_executable(${EXE_NAME} ${MAIN_SOURCES})
if (${MINGW})
    set(CMAKE_C_FLAGS "-W -Wall -Wextra -std=c11 -D_UCRT")
    target_link_libraries(${EXE_NAME} -lucrt)
else ()
    set(CMAKE_C_FLAGS "-W -Wall -Wextra -std=c11")
endif ()

cmake调用:

cmake -DCMAKE_TOOLCHAIN_FILE=/usr/share/mingw/toolchain-mingw64.cmake

和结果

$ make
[ 50%] Building C object CMakeFiles/test.dir/src/test.c.obj
[100%] Linking C executable test.exe
[100%] Built target test

1
这取决于MinGW的版本。例如,如果你正在使用MSYS2,你应该安装他们默认支持此功能的GCC版本,而不是试图让其他版本来定位ucrt。 - HolyBlackCat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接