rt3 发表于 2020-7-23 09:09:08

Debian 10.4 无法 加载 math 库

本帖最后由 rt3 于 2020-7-23 09:20 编辑

root@debian:/home/mxf/im/im1/src2/C/2# gcc main.c -lmath -o main.run
/usr/bin/ld: cannot find -lmath
collect2: error: ld returned 1 exit status

root@debian:/home/mxf/im/im1/src2/C/2# gcc main.c -L/usr/lib64 -o main.run
/usr/bin/ld: /tmp/ccOr1LF7.o: in function `prime_number':
main.c:(.text+0xdf): undefined reference to `sqrt'
collect2: error: ld returned 1 exit status

root@debian:/home/mxf/im/im1/src2/C/2# gcc main.c -L/usr/lib -o main.run
/usr/bin/ld: /tmp/cc14U11e.o: in function `prime_number':
main.c:(.text+0xdf): undefined reference to `sqrt'
collect2: error: ld returned 1 exit status

root@debian:/home/mxf/im/im1/src2/C/2# gcc main.c -L/usr/lib32 -o main.run
/usr/bin/ld: skipping incompatible /usr/lib32/libgcc_s.so.1 when searching for libgcc_s.so.1
/usr/bin/ld: skipping incompatible /usr/lib32/libc.so when searching for -lc
/usr/bin/ld: skipping incompatible /usr/lib32/libc.a when searching for -lc
/usr/bin/ld: skipping incompatible /usr/lib32/libgcc_s.so.1 when searching for libgcc_s.so.1
/usr/bin/ld: /tmp/ccLQtNcx.o: in function `prime_number':
main.c:(.text+0xdf): undefined reference to `sqrt'
collect2: error: ld returned 1 exit status

root@debian:/home/mxf/im/im1/src2/C/2# gcc main.c -L/usr/libx32 -o main.run
/usr/bin/ld: skipping incompatible /usr/libx32/libgcc_s.so.1 when searching for libgcc_s.so.1
/usr/bin/ld: skipping incompatible /usr/libx32/libc.so when searching for -lc
/usr/bin/ld: skipping incompatible /usr/libx32/libc.a when searching for -lc
/usr/bin/ld: skipping incompatible /usr/libx32/libgcc_s.so.1 when searching for libgcc_s.so.1
/usr/bin/ld: /tmp/ccaFK2hG.o: in function `prime_number':
main.c:(.text+0xdf): undefined reference to `sqrt'
collect2: error: ld returned 1 exit status

root@debian:/home/mxf/im/im1/src2/C/2# echo $LD_LIBRARY_PATH
/usr/local/lib:/usr/lib:/usr/lib32:/usr/libx32:/usr/lib64

root@debian:/# gcc -lmath --verbose
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/8/lto-wrapper
OFFLOAD_TARGET_NAMES=nvptx-none
OFFLOAD_TARGET_DEFAULT=1
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Debian 8.3.0-6' --with-bugurl=file:///usr/share/doc/gcc-8/README.Bugs --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++ --prefix=/usr --with-gcc-major-version-only --program-suffix=-8 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --enable-bootstrap --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-libmpx --enable-plugin --enable-default-pie --with-system-zlib --with-target-system-zlib --enable-objc-gc=auto --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 8.3.0 (Debian 8.3.0-6)
COMPILER_PATH=/usr/lib/gcc/x86_64-linux-gnu/8/:/usr/lib/gcc/x86_64-linux-gnu/8/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/8/:/usr/lib/gcc/x86_64-linux-gnu/
LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/8/:/usr/lib/gcc/x86_64-linux-gnu/8/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/8/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/8/../../../:/lib/:/usr/lib/
COLLECT_GCC_OPTIONS='-v' '-mtune=generic' '-march=x86-64'
/usr/lib/gcc/x86_64-linux-gnu/8/collect2 -plugin /usr/lib/gcc/x86_64-linux-gnu/8/liblto_plugin.so -plugin-opt=/usr/lib/gcc/x86_64-linux-gnu/8/lto-wrapper -plugin-opt=-fresolution=/tmp/ccpoNCDq.res -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu -dynamic-linker /lib64/ld-linux-x86-64.so.2 -pie /usr/lib/gcc/x86_64-linux-gnu/8/../../../x86_64-linux-gnu/Scrt1.o /usr/lib/gcc/x86_64-linux-gnu/8/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/8/crtbeginS.o -L/usr/lib/gcc/x86_64-linux-gnu/8 -L/usr/lib/gcc/x86_64-linux-gnu/8/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/8/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/8/../../.. -lmath -lgcc --push-state --as-needed -lgcc_s --pop-state -lc -lgcc --push-state --as-needed -lgcc_s --pop-state /usr/lib/gcc/x86_64-linux-gnu/8/crtendS.o /usr/lib/gcc/x86_64-linux-gnu/8/../../../x86_64-linux-gnu/crtn.o
/usr/bin/ld: cannot find -lmath
collect2: error: ld returned 1 exit status


修改 LD_LIBRARY_PATH 变量 后 已运行 ldconfig

经验证 系统已安装 /usr/include/math.h

谢谢

赚小钱 发表于 2020-7-23 09:09:09

rt3 发表于 2020-7-23 18:54
还是报错

-lmath 改成 -lm

赚小钱 发表于 2020-7-23 09:35:05

ldconfig -p | grep math

回复输出结果

rt3 发表于 2020-7-23 14:07:30

赚小钱 发表于 2020-7-23 09:35
回复输出结果

libtommath.so.1 (libc6,x86-64) => /lib/x86_64-linux-gnu/libtommath.so.1
libtommath.so (libc6,x86-64) => /lib/x86_64-linux-gnu/libtommath.so
libquadmath.so.0 (libc6,x32) => /libx32/libquadmath.so.0
libquadmath.so.0 (libc6,x86-64) => /lib/x86_64-linux-gnu/libquadmath.so.0
libquadmath.so.0 (libc6) => /lib32/libquadmath.so.0
libgimpmath-2.0.so.0 (libc6,x86-64) => /lib/libgimpmath-2.0.so.0
libImath-2_2.so.23 (libc6,x86-64) => /lib/x86_64-linux-gnu/libImath-2_2.so.23

赚小钱 发表于 2020-7-23 14:37:54

rt3 发表于 2020-7-23 14:07
libtommath.so.1 (libc6,x86-64) => /lib/x86_64-linux-gnu/libtommath.so.1
libtommath.so (libc6,x8 ...

想到一个问题,你用了什么函数,需要 -lmath

rt3 发表于 2020-7-23 18:13:10

赚小钱 发表于 2020-7-23 14:37
想到一个问题,你用了什么函数,需要 -lmath

用到了 sqrt(),源代码如下
// 随意输入一个正整数,求其之前的数质数的个数

#include <stdio.h>
#include <math.h>
int prime_number(int x);

int main()

{
    int total = 2;
      int temp = 0;
      int m = 0;                                    // 输入的整数
      int i;                                             // 循环次数
      printf("输入一个整数:");
      scanf("%d",&m);
      printf("2 是素数\n");
      printf("3 是素数\n");
      for(i = 2;i <= m;i++)
       {
                temp = prime_number(i);

                if(temp == 1)
                {
                        printf("%d 是素数\n", i);
                        total++;
                }
      }
      printf("%d 以内有 %d 个素数\n",m,total);
      
    return 0;

}


int prime_number(int i)

{

      int j;
      int n = 0;
      int temp = 0;
      int k;                                                // i 的平方根
      k = (int)sqrt( (double)i );                  // 求平方根,注意sqrt()的参数为 double 类型,这里要强制转换i的类型
      for(j = 2;j <= k;j++)
    {
                if(i%j == 0)                               // 问题在此处 ! i为 9、15、25、27、33、35、39、45、49时,为什么能跳过 n++ ?         
                {
                         n++;
                }

                if(n == 0)
                {
                        temp = 1;
                }
      }
                        return temp;
}

赚小钱 发表于 2020-7-23 18:46:51

rt3 发表于 2020-7-23 18:13
用到了 sqrt(),源代码如下

我使用sqrt 函数的时候,不需要链接 math,你把 -lmath 删掉编译试一下

rt3 发表于 2020-7-23 18:54:27

赚小钱 发表于 2020-7-23 18:46
我使用sqrt 函数的时候,不需要链接 math,你把 -lmath 删掉编译试一下

还是报错
/usr/bin/ld: /tmp/ccImlklB.o: in function `prime_number':
main.c:(.text+0xdf): undefined reference to `sqrt'
collect2: error: ld returned 1 exit status

rt3 发表于 2020-7-23 19:13:54

赚小钱 发表于 2020-7-23 18:46
我使用sqrt 函数的时候,不需要链接 math,你把 -lmath 删掉编译试一下

你的 LD_LIBRARY_PATH 变量值是什么? 发行版的代号和版本呢?

赚小钱 发表于 2020-7-23 20:06:17

rt3 发表于 2020-7-23 19:13
你的 LD_LIBRARY_PATH 变量值是什么? 发行版的代号和版本呢?

LD_LIBRARY_PATH 是空的

$ cat /etc/os-release
NAME="Arch Linux"
PRETTY_NAME="Arch Linux"
ID=arch
BUILD_ID=rolling
ANSI_COLOR="38;2;23;147;209"
HOME_URL="https://www.archlinux.org/"
DOCUMENTATION_URL="https://wiki.archlinux.org/"
SUPPORT_URL="https://bbs.archlinux.org/"
BUG_REPORT_URL="https://bugs.archlinux.org/"
LOGO=archlinux

赚小钱 发表于 2020-7-23 20:09:06

rt3 发表于 2020-7-23 18:54
还是报错

man 3 sqrt
页: [1]
查看完整版本: Debian 10.4 无法 加载 math 库