【问题标题】:Undefined reference's to c math library on ubuntu未定义对 ubuntu 上的 c 数学库的引用
【发布时间】:2014-03-14 17:45:54
【问题描述】:

我一直在尝试在 Ubuntu 12.04.4 LTS 服务器上编译后运行我的程序,但没有任何运气。请注意,我一直在我的 Mac book 上进行开发,没有任何问题。

我已经尝试了以下几种方法:

  • 添加 -fno-builtin 编译参数
  • 添加 -lm 以编译参数(将其放置在 *.c 文件之前和之后的几个不同位置
  • 在源代码文件中添加了“#define _ISOC99_SOURCE”
  • 使用 --std=gnu99 代替 --std=c99
  • 添加 -lt 编译参数
  • 添加 -Wl,--no-as-needed 编译参数

谁能与我分享我做错了什么?或者我的配置中缺少什么?下面我添加了我的 Makefile 的内容、编译的输出、gcc -v 的输出和我尝试运行程序时的输出。

尝试运行时程序的输出:

ext/adl-pure.a(adl-main.o): In function `adl_aggregate':
adl-main.c:(.text+0x1d89): undefined reference to `roundf'
adl-main.c:(.text+0x2503): undefined reference to `lroundf'
ext/adl-pure.a(adl-calc.o): In function `adl_get_am_day_target':
adl-calc.c:(.text+0x2f8): undefined reference to `lroundf'
ext/adl-pure.a(adl-calc.o): In function `adl_pal_percentage':
adl-calc.c:(.text+0x787): undefined reference to `floorf'
adl-calc.c:(.text+0x790): undefined reference to `lroundf'
collect2: ld returned 1 exit status

这是我的制作文件:

# Makefile.lib

CC=gcc
AR=ar

CFLAGS=

.PHONY: all
.SUFFIXES:

ADL_SOURCES=adl-main.c adl-data.c adl-calc.c adl-fail.c adl-misc.c

all: adl-pure.a

adl-pure.a: $(ADL_SOURCES:.c=.o)
        $(AR) -rus $@ $^

%.o: %.c
        $(CC) -o $@ -MMD $< -lm -std=c99 -O2 -Wall -pedantic $(CFLAGS) -c

clean:
        rm -f adl-pure.a *.o *.d

-include $(ADL_SOURCES:.c=.d)

这是它的输出:

gcc -o adl-main.o -MMD adl-main.c -lm -std=c99 -O2 -Wall -pedantic -fPIC -c
gcc -o adl-data.o -MMD adl-data.c -lm -std=c99 -O2 -Wall -pedantic -fPIC -c
gcc -o adl-calc.o -MMD adl-calc.c -lm -std=c99 -O2 -Wall -pedantic -fPIC -c
gcc -o adl-fail.o -MMD adl-fail.c -lm -std=c99 -O2 -Wall -pedantic -fPIC -c
gcc -o adl-misc.o -MMD adl-misc.c -lm -std=c99 -O2 -Wall -pedantic -fPIC -c
ar -rus adl-pure.a adl-main.o adl-data.o adl-calc.o adl-fail.o adl-misc.o
ar: creating adl-pure.a

这是 gcc -v 的输出:

Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.6/lto-wrapper
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu/Linaro 4.6.3-1ubuntu5' --with-bugurl=file:///usr/share/doc/gcc-4.6/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.6 --enable-shared --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.6 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --enable-plugin --enable-objc-gc --disable-werror --with-arch-32=i686 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5)

【问题讨论】:

  • 在您的帖子中给出未定义符号错误消息的实际命令是什么?
  • 您还应该养成将与链接阶段相关的所有内容放在标志集末尾的习惯,将源/s文件的名称放在中间,其他所有内容在编译器调用的第一部分。
  • @user2485710 在我的情况下该命令会是什么样子?
  • @leeduhem 未定义符号错误是什么意思?我继承了这个 C 库,我对 C 编程非常陌生。

标签: c ubuntu gcc


【解决方案1】:

这个例子

#include <math.h>
#include <stdio.h>
int main()
{
    float f = 33.33f;
    f = roundf(f);
    printf("%f\n", f);
    return (0);
}

编译就好了

gcc -std=c99 -fno-builtin a.c -lm

相应地更改你的 Makefile,你会没事的。

【讨论】:

  • 我相应地更改了我的makefile,这是现在的输出: .... gcc -std=c99 -fno-builtin -o adl-main.o -MMD adl-main.c -lm -O2 -Wall -pedantic -fPIC -c ...仍然没有运气。
  • @Niels 也看看你的标志的顺序,这不是我所做的或我建议的。 right 的链接器标志,middle 的源代码,left 的编译器标志
  • @Niels 您所做的是编译源文件以生成目标文件 (gcc -c),但原始帖子中的未定义符号消息是链接错误。
  • @user2485710:我将构建命令更改为以下输出:gcc -std=c99 -fno-builtin -O2 -Wall -pedantic -c -fPIC -o adl-main.o -MMD adl- main.c -lm。根据您之前关于安排编译器标志的回答,这有意义吗?
  • @Niels -lmgcc -c ... 中没有意义,尽管它不会导致错误。
猜你喜欢
  • 2014-05-24
  • 2015-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-10
  • 1970-01-01
  • 1970-01-01
  • 2013-04-22
相关资源
最近更新 更多