gcc 编译错误:"undefined reference to 'sqrt'

程序源码如下所示:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<time.h>

//判断是否为素数
int isPrime(int n)
{
    int i,k;
    k = sqrt(n);
    for (i = 2; i <= k;i++){
        if (n%i == 0)
            break;
    }

    if (i <=k){
        return -1;
    }else {
        return 0;
    }
}

int main()
{
    printf("%s %d %d\n",__func__,__LINE__,isPrime(13));
    return 0;
}

编译结果如下所示:

sqrt需要的头文件为math.h,但是我们已经包含了盖头文件为什么还会报错呢。因为我们包好了头文件,还需要编译器指定这头文件对应的库文件,库文件一般都在/usr/lib目录下。 gcc默认指定的有几个库文件,比如libstd。但是不包括math的库,所需要的math库不是gcc默认指定的,所以需要手动连接math库,需要在编译的时候加上一个-lm选项。 -l是指定XXX库,m就指math库。即:gcc hello.c -lm -lm就是链接到math库的问题。

编译成功,且可以正常运行

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要在 ARM 架构上编译 X11 库和 XShm 库,并链接到你的程序中,你需要使用 ARM 架构的交叉编译工具链。一些常见的交叉编译工具链包括 Linaro 和 CodeSourcery。 假设你已经安装并配置好了交叉编译工具链,并且已经下载了 X11 库和 XShm 库的源代码,那么你可以按照以下步骤进行交叉编译: 1. 设置交叉编译工具链的环境变量。例如,如果你使用的是 Linaro 工具链,你可以运行以下命令: ``` export CC=arm-linux-gnueabihf-gcc export CXX=arm-linux-gnueabihf-g++ export AR=arm-linux-gnueabihf-ar export LD=arm-linux-gnueabihf-ld ``` 2. 进入 X11 库的源代码目录,运行以下命令进行配置: ``` ./configure --host=arm-linux-gnueabihf --prefix=/path/to/install ``` 其中 `--host` 参数指定了目标架构,`--prefix` 参数指定了安装目录。 3. 运行 `make` 命令进行编译。 4. 进入 XShm 库的源代码目录,运行以下命令进行配置: ``` ./configure --host=arm-linux-gnueabihf --prefix=/path/to/install ``` 其中 `--host` 参数指定了目标架构,`--prefix` 参数指定了安装目录。 5. 运行 `make` 命令进行编译。 6. 在编译你的程序时,使用以下命令进行链接: ``` gcc -o your_program your_program.c -L/path/to/x11/lib -L/path/to/xshm/lib -lX11 -lXext -lXrender -lXfixes -lXcomposite -lXau -lXdmcp -lXshmfence -lXtst -lXrandr -lXinerama ``` 其中 `-L/path/to/x11/lib` 和 `-L/path/to/xshm/lib` 分别指定了 X11 库和 XShm 库的目录,`-lX11`、`-lXext`、`-lXrender` 等参数表示链接相关的库。在其他操作系统或编译工具中,类似的链接命令可能会有所不同。 完成以上步骤后,你就可以在 ARM 设备上运行你的程序了。注意,你还需要在 ARM 设备上安装 X11 和相关的库才能使用 XShm。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值