• 第4章 4.3代码编译问题


    直接make,会提示错误, 

    undefined reference to __stack_chk_fail'  , 这里google了一下,说是要给 指定的.o编译的时候加上   -fno-stack-protector 参数,

    加完了之后, 有报  strlen 未定义的引用,因为 strlen是自己在 lib.h里定义的,(没有使用GCC自己的), 而且定义成了 inline函数,这个导致的错误,下面是从网上搜来的

    https://blog.csdn.net/chenxizhan1995/article/details/103004166

    解决办法

    方法1. 开启 -O 优化

    gcc -O   -c -o permutation.o permutation.c
    gcc   permutation.o  -lgmp -o permutation

    方法2. 添加非inline的原型声明

    void swap(char *x, char *y);
    inline void swap(char *x, char *y){char t = *x; *x=*y; *y=t;}
    

      cc --std=c11 -Wall -c -o permutation.o permutation.c

    gcc   permutation.o  -lgmp -o permutation
    

    方法3. 声明时同时使用static关键字

    static inline void swap(char *x, char *y){char t = *x; *x=*y; *y=t;}
    

    原因

    生成汇编代码,查看swap函数的情况,做成表格如下
    C11 inline 函数编译

    总结

    一开始出现编译错误的原因是对swap的调用是真的调用(没有转换成内嵌代码),同时还没有输出swap的对应的汇编代码。

    C中定义内联函数要同时使用static inline修饰符,这样生成的代码开启优化选项后不输出汇编代码,直接内嵌调用(一般情况);如果添加非inline函数原型,相当于extern inline swap(){...},即使开启优化选项,也会生成相应的汇编代码,只不过本地调用直接内嵌(一般情况)。

    C和C++不一样,C++的inline函数自带static属性,而C中的需要显式指定static才行。

    参考链接

    gcc 9.2 文档中inline函数    https://gcc.gnu.org/onlinedocs/gcc-9.2.0/gcc/Inline.html#Inline

  • 相关阅读:
    SpringBoot整合JavaMail发送邮件
    SpringBoot使用SpringDataJPA完成CRUD
    开源「高逼格」简历例句
    Spring Boot 两种多数据源配置:JdbcTemplate、Spring-data-jpa
    Spring Boot
    Socket网络编程
    项目action:前台传多个dataWrap给后台
    Java——定时任务调度工具
    Spring5源码,@ModelAttribute
    windows下MongoDB的安装及配置
  • 原文地址:https://www.cnblogs.com/davytitan/p/13502076.html
Copyright © 2020-2023  润新知