【问题标题】:C: Undefined reference to floorC:未定义的地板参考
【发布时间】:2013-02-07 03:29:44
【问题描述】:

我在 Ubuntu 上使用 Eclipse 来编写/编译/运行 C 代码。 我正在尝试构建我的项目。 以下是 Eclipse 控制台中的输出。

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

谁能帮我弄清楚问题是什么以及如何解决它?

【问题讨论】:

标签: c gcc eclipse-cdt ubuntu-12.04 math.h


【解决方案1】:

您需要在目标文件之后链接库。

你有:

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';同样的问题,同样的解决方案。我怀疑这是否是 SO 中唯一的此类问题。

【讨论】:

    【解决方案2】:

    您需要链接数学库,即在链接行的末尾添加-lm。不知道如何在 Eclipse 中执行此操作,抱歉。

    【讨论】:

      【解决方案3】:

      请注意,您的输出中的链接标志看起来是乱序的。也许您试图通过 Eclipse 中的链接器标志添加-lm。这会导致 Eclipse 出现问题。我建议你试试……

      右键单击您的项目 -> 属性 -> C/C++ 构建 -> 设置 -> GCC 链接器 -> 库 -> 添加“m” -> 应用 -> 构建

      或者,在最上面的列表中,确保 -L 和 -l 参数位于链接过程中的 .o 文件之后。

      我今天刚被这件事击中,有一段时间没有想到。

      【讨论】:

      • '右键单击您的项目-> 属性-> C/C++ 构建-> 设置-> GCC 链接器-> 库-> 添加“m”-> 应用-> 构建'工作。非常感谢!
      猜你喜欢
      • 2011-09-11
      • 2011-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-18
      • 2023-03-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多