2013-02-07 70 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)。 –