clock_gettime 和 CLOCK_MONOTONIC 的编译错误

问题描述 投票:0回答:4

我在程序中使用clock_gettime。我已经尝试过包括以及但都不起作用。我还在编译器参数中添加了 -lrt 但仍然遇到相同的错误。

已开启

CentOS Linux release 7.2.1511 (Core)
gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-4)
GNU ld version 2.23.52.0.1-55.el7 20130226
ldd (GNU libc) 2.17

编译器输出:

gcc -o main packet.c connect.c transport.c accept.c main.c close.c util.c receive.c send.c congestion.c -Wall -g -std=c99 -lrt
util.c: In function ‘millis’:
util.c:42:21: error: storage size of ‘t’ isn’t known
     struct timespec t;
                     ^
util.c:43:5: warning: implicit declaration of function ‘clock_gettime’ [-Wimplicit-function-declaration]
     clock_gettime(CLOCK_MONOTONIC_RAW, &t);
     ^
util.c:43:19: error: ‘CLOCK_MONOTONIC_RAW’ undeclared (first use in this function)
     clock_gettime(CLOCK_MONOTONIC_RAW, &t);
               ^

生成文件

CFLAGS = -Wall -g -std=c99
LIBS = -lrt

# Should be equivalent to your list of C files, if you don't build selectively
SRC=$(wildcard *.c)

main: $(SRC)
    gcc -o $@ $^ $(CFLAGS) $(LIBS)

util.h 顶部

#ifndef UTILS_438_H_
#define UTILS_438_H_

#include "const.h"
#include "data.h"
#include "transport.h"

#include <time.h>

util.c 顶部

#include "util.h"

#include <time.h>
#include <stdio.h>
#include <string.h>

如果我可以提供更多信息来帮助回答这个问题,请告诉我

c gcc compiler-errors libc
4个回答
11
投票

在包含标题(

<time.h>
)之前,请执行

#define _POSIX_C_SOURCE 199309L

http://man7.org/linux/man-pages/man2/clock_gettime.2.html

glibc 的功能测试宏要求(请参阅 feature_test_macros(7)):

   clock_getres(), clock_gettime(), clock_settime():
          _POSIX_C_SOURCE >= 199309L

http://man7.org/linux/man-pages/man7/feature_test_macros.7.html

_POSIX_C_SOURCE 定义此宏会导致头文件将定义公开为 如下:

  ·  The value 1 exposes definitions conforming to POSIX.1-1990 and
     ISO C (1990).

  ·  The value 2 or greater additionally exposes definitions for
     POSIX.2-1992.

  ·  The value 199309L or greater additionally exposes definitions
     for POSIX.1b (real-time extensions).

  ·  The value 199506L or greater additionally exposes definitions
     for POSIX.1c (threads).

  ·  (Since glibc 2.3.3) The value 200112L or greater additionally
     exposes definitions corresponding to the POSIX.1-2001 base
     specification (excluding the XSI extension).  This value also
     causes C95 (since glibc 2.12) and C99 (since glibc 2.10)
     features to be exposed (in other words, the equivalent of
     defining _ISOC99_SOURCE).

  ·  (Since glibc 2.10) The value 200809L or greater additionally
     exposes definitions corresponding to the POSIX.1-2008 base
     specification (excluding the XSI extension).

4
投票

只需将 -std=c99 替换为 -std=gnu99 即可。 这样你就不必添加 _POSIX_C_SOURCE


0
投票

如果您可以使用以下链接器和编译器标志

CFLAGS  = -g -Wall -std=c99 -D_POSIX_SOURCE -D_GNU_SOURCE
LDFLAGS = -lpthread -lrt 

您可以在Linux系统中完成构建。 -lrt 链接器和 -D_POSIX_SOURCE 是重要的


0
投票

试试这个: #包括 而不是这个: #包括 (或者您可以同时使用两者以确保安全)。 解决了我的问题

© www.soinside.com 2019 - 2024. All rights reserved.