第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函数的情况,做成表格如下
总结
一开始出现编译错误的原因是对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
~奋力追求梦想的泰坦~