2013-02-07 104 views
4

我在Ubuntu上使用Eclipse編寫/編譯/運行C代碼。 我正在嘗試構建我的項目。 以下是Eclipse控制檯中的輸出。C:未定義的地板參考

22:18:31 **** Build of configuration Debug for project Project1 **** 
make all 
Building file: ../project1.c 
Invoking: GCC C Compiler 
gcc -I/lib/i386-linux-gnu -O0 -g3 -Wall -c -fmessage-length=0 -pthread -lm -MMD -MP -MF"project1.d" -MT"project1.d" -o "project1.o" "../project1.c" 
../project1.c: In function ‘main’: 
../project1.c:146:6: warning: unused variable ‘this_thread_id’ [-Wunused-variable] 
../project1.c: In function ‘_pre_init’: 
../project1.c:126:1: warning: control reaches end of non-void function [-Wreturn-type] 
Finished building: ../project1.c 

Building file: ../scheduler.c 
Invoking: GCC C Compiler 
gcc -I/lib/i386-linux-gnu -O0 -g3 -Wall -c -fmessage-length=0 -pthread -lm -MMD -MP -MF"scheduler.d" -MT"scheduler.d" -o "scheduler.o" "../scheduler.c" 
Finished building: ../scheduler.c 

Building target: Project1 
Invoking: GCC C Linker 
gcc -L/lib/i386-linux-gnu -lm -pthread -o "Project1" ./project1.o ./scheduler.o 
./project1.o: In function `advance_global_time': 
/home/akshay/Cworkspace/Project1/Debug/../project1.c:50: undefined reference to `floor' 
collect2: ld returned 1 exit status 
make: *** [Project1] Error 1 

任何人都可以請幫我弄清楚是什麼問題以及如何解決它?

+3

你是如何添加數學庫的?請參閱[這是我的舊答案](http://stackoverflow.com/a/13784484/440558)可能的解決方案。 –

+0

[Undefined reference to'pthread \ _create']可能重複(http://stackoverflow.com/questions/9253200/undefined-reference-to-pthread-create) –

回答

2

您需要鏈接數學庫,即在鏈接行的末尾添加-lm。不知道如何在Eclipse中做到這一點,抱歉。

1

請注意,輸出中的鏈接標誌看起來不按順序排列。也許你試圖通過Eclipse中的鏈接器標誌添加-lm。這在Eclipse中導致問題。我建議你試試...

右鍵點擊你的項目 - >屬性 - > C/C++編譯 - >設置 - > GCC鏈接器 - > Libraies - >添加 「M」 - >應用 - >構建

或者,在列表中確保-L和-l參數在鏈接過程中的.o文件之後。

我剛剛被今天撞到了,它躲過了我一會兒。

+0

'右鍵點擊你的項目 - >屬性 - > C/C++構建 - >設置 - > GCC鏈接器 - >庫 - >添加「m」 - >應用 - >構建'工作。萬分感謝! – Akshay7589

7

您需要在目標文件之後鏈接庫。

您有:

gcc -L/lib/i386-linux-gnu -lm -pthread -o "Project1" ./project1.o ./scheduler.o 

您需要:

gcc -L/lib/i386-linux-gnu -pthread -o "Project1" ./project1.o ./scheduler.o -lm 

似乎已經在連接器的工作方式的改變 - 在某些時候,它可以指定共享庫(如數學庫)在對象文件之前,並且都可以工作。但是,現在,如果共享庫在掃描時不滿足任何符號,則在鏈接過程中將忽略它。確保在庫修復此問題之前列出了目標文件。

另請參閱Undefined reference to 'pthread_create';同樣的問題,相同的解我懷疑這是否是唯一的這樣的問題。

-2

如果您只需要floor函數,則可以使用int或long cast來代替它,它將返回相同的結果。

float x = 3.5; 
int y = (int) x; 
+1

'floor()'函數以不同的方式處理負數:'(int)-3.5'映射到'-3',但'floor(-3.5)'映射到'-4'(標準爲:'floor'函數計算最大整數值不大於'x'_)。它也處理諸如±∞和Nan的東西,演員處理得不好(我從+∞,-∞和Nan獲得了-2147483648)。 –