zoukankan      html  css  js  c++  java
  • 第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

  • 相关阅读:
    利用开源jPlayer播放.flv视频文件
    记录一次项目中使用memcatch添加端口以及自动运行
    学习制作菜单导航
    利用vs2013简单初探Python
    磨刀不误砍柴工,使用visual studio之前应该先了解这些...
    关于asp.net与jquery ajax 的一些补充
    Matlab转opencv遇到的坑
    WMS
    Javascript 学习笔记
    卷积神经网络学习笔记(CNN)
  • 原文地址:https://www.cnblogs.com/davytitan/p/13502076.html
Copyright © 2011-2022 走看看