[C] Problemen met struct timespec

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik ben bezig met een programmaatje wat gebruik maakt van de system call clock_gettime die als tweede parameter een struct timespec nodig heeft. Code ziet er zo uit:

C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
#include <time.h>
#include <string.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {
    const char* input = argv[1];

    long long number = atoll(argv[3]);
        
    struct timespec before, after;
    clock_gettime(CLOCK_REALTIME, &before);
        
    long long i;
    for (i = 0; i < number; i++) {
        ;
    }
        
    clock_gettime(CLOCK_REALTIME, &after);
    long time_taken = (after.tv_nsec - before.tv_nsec);
}


Dit compileerde ik met
code:
1
gcc -ansi -o exercise1 exercise.c


wat de volgende foutmeldingen opleverde:
code:
1
2
3
4
5
6
7
gcc -ansi -o exercise1 exercise1.c
exercise1.c: In function `main':
exercise1.c:59: error: storage size of `before' isn't known
exercise1.c:59: error: storage size of `after' isn't known
exercise1.c:60: error: `CLOCK_REALTIME' undeclared (first use in this function)
exercise1.c:60: error: (Each undeclared identifier is reported only once
exercise1.c:60: error: for each function it appears in.)

(regelnummers kloppen niet; het voorbeeld is alleen het stukje wat fout gaat; er staan nog wat dingen voor)

Na wat zoeken op internet blijkt dat de ANSI-standaard geen timespec ondersteunt, dus dan maar zonder -ansi:
code:
1
2
3
4
5
gcc -o exercise1 exercise1.c
/tmp/ccynCQEJ.o: In function `main':
exercise1.c:(.text+0x251): undefined reference to `clock_gettime'
exercise1.c:(.text+0x2a4): undefined reference to `clock_gettime'
collect2: ld returned 1 exit status


En nou snap ik er niks meer van. Wat doe ik nou fout? Ik gebruik GCC 3.3.6

Acties:
  • 0 Henk 'm!

  • Sappie
  • Registratie: September 2000
  • Laatst online: 15:31

Sappie

De Parasitaire Capaciteit!

Aangezien het om "undefined references" gaat vergeet je waarschijnlijk een library mee te linken. De library waarin de functie clock_gettime gespecificeerd staat.
code:
1
librt

Lijkt de library te zijn, als ik deze pagina moet geloven: http://www.tin.org/bin/ma...ion=3&topic=clock_gettime

Specs | Audioscrobbler


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 21:01
Bij dit soort problemen is het altijd nodig om te vermelden op welk platform je werkt. Onder FreeBSD (en andere UNIX-varianten) compileert de code namelijk wel direct (ook met -ansi).

Onder Linux is men wat stricter met POSIX API's in standard headers (die daar eigenlijk niet in thuishoren). __USE_POSIX definiëren lost dit probleem ook op (dan kun je de rest van de ANSI-compatibiliteit nog wel laten controleren).

Verder moet je onder Linux inderdaad linken met librt, wat tenminste in mijn man page gewoon staat, en hier ook: ;)
Note
Most systems require the program be linked with the librt library to use these functions.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Bedankt, linken met librt lost het inderdaad op. Ik kijk vanavond nog even naar __USE_POSIX want ik vind ansi wel fijn :)

Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 15:26
Verwijderd schreef op maandag 13 augustus 2007 @ 15:58:
Bedankt, linken met librt lost het inderdaad op. Ik kijk vanavond nog even naar __USE_POSIX want ik vind ansi wel fijn :)
-ansi
... It also enables the undesirable and rarely used ISO trigraph feature. For the C compiler, it disables recognition of C++ style `//' comments as well as the inline keyword.
Vertel eens waarom je -ansi zo fijn vindt dan? ( kijk eens hier http://en.wikipedia.org/wiki/C_trigraph bijvoorbeeld :P )

[ Voor 7% gewijzigd door farlane op 13-08-2007 23:13 ]

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.