第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

posted @ 2020-08-14 14:35  姜大伟  阅读(206)  评论(0编辑  收藏  举报