Toon posts:

[C] Problemen met struct timespec

Pagina: 1
Acties:

Onderwerpen


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

  • Sappie
  • Registratie: September 2000
  • Laatst online: 01-11 23:46

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


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 16:50
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.

Verwijderd

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

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 02-11 14:22
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.