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
谢谢 rt3 发表于 2020-7-23 18:54
还是报错
-lmath 改成 -lm ldconfig -p | grep math
回复输出结果 赚小钱 发表于 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
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 赚小钱 发表于 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;
} rt3 发表于 2020-7-23 18:13
用到了 sqrt(),源代码如下
我使用sqrt 函数的时候,不需要链接 math,你把 -lmath 删掉编译试一下 赚小钱 发表于 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
赚小钱 发表于 2020-7-23 18:46
我使用sqrt 函数的时候,不需要链接 math,你把 -lmath 删掉编译试一下
你的 LD_LIBRARY_PATH 变量值是什么? 发行版的代号和版本呢? 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
rt3 发表于 2020-7-23 18:54
还是报错
man 3 sqrt
页:
[1]