2015-10-13 84 views
1

我試圖編譯timersub()函數在Linux,但我總是得到:在Linux中隱式聲明timersub()函數 - 我必須定義什麼?

test.c: In function ‘main’: 
test.c:27:2: warning: implicit declaration of function ‘timersub’ [-Wimplicit-function-declaration] 
    timersub(&now, &then, &diff); 
^

/tmp/ccLzfLsl.o: In function `main': 
test.c:(.text+0x55): undefined reference to `timersub' 
collect2: error: ld returned 1 exit status 

這是所有我使用的庫函數的只是一個簡單的代碼..

#define _XOPEN_SOURCE 
#define _POSIX_SOURCE 
#include <stdio.h> 

#include <stdlib.h> 
#include <string.h> 
#include <time.h> 
#include <sys/time.h> 
#include "openflow.h" 
#include "cbench.h" 
#include "fakeswitch.h" 
#include <unistd.h> 



int main() 
{ 
    struct timeval now, then, diff; 


    gettimeofday(&then,NULL); 

    sleep(1); 

    gettimeofday(&now, NULL); 

    timersub(&now, &then, &diff); 

return 0; 


} 

我與它編譯:

GCC --std = C99 -Wall -DTRACE -o測試test.c的

回答

1

manual。它不在POSIX中,而是在BSD功能中。所以你需要_BSD_SOURCE

在頂部將其定義:

#define _BSD_SOURCE 

或者用編譯:

gcc --std=c99 -Wall -DTRACE -D_BSD_SOURCE -o test test.c 

,因爲Glibc 2.20,宏_BSD_SOURCE已棄用,通過_DEFAULT_SOURCE已被取代。從feature test macros

_DEFAULT_SOURCE(因爲glibc的2.19)

這個宏可以定義爲 確保「默認」的定義是提供即使在 違約,否則將禁用,因爲發生在個別 宏被明確地定義,或者編譯器在其「標準」模式(例如,cc -std = c99)中被調用爲 之一。定義_DEFAULT_SOURCE 而不定義其他單個宏或調用 中的編譯器時,其中一個「標準」模式不起作用。

「默認」的定義包括那些要求POSIX.1-2008和 ISO C99,以及最初從BSD 和系統V.衍生論的glibc 2.19各種定義和前面,這些默認值是 約相當於顯式定義如下:

CC -D_BSD_SOURCE -D_SVID_SOURCE -D_POSIX_C_SOURCE = 200809

但是,如果你使用的是老Gblic,你仍然需要使用_BSD_SOURCE

+0

FYI我的gcc編譯器現在(2016)說,你應該使用_DEFAULT_SOURCE,不_BSD_SOURCE。 – moodboom

+1

@moodboom的確。但是舊的Glibc可能仍然需要'_BSD_SOURCE'。我已經更新了答案,以說明差異。 –

0

基本上我剛剛刪除的#define _XOPEN_SOURCE的#define和_POSIX_SOURCE,只用gcc -Wall -DTRACE編譯它和它的工作

相關問題