问题原因
链接的库使用的低版本gcc编译,链接时又使用高版本gcc,高版本的gcc自带了-fPIC编译选项
解决方法
1、Makefile中gcc编译选项加上 -no-pie
自己电脑上的项目,虽然Makefile可以随意更改,但是一般来说需要和库上的Makefile相同来尽可能避免由于Makefile不同产生的bug。
既然库上Makefile没有加 -no-pie参数也能编译成功,说明采用的gcc版本比较低,只需要在我们电脑上安装低版本的gcc即可
2、在高版本linux中安装低版本的gcc(以ubuntu20为例)
查看当前的gcc版本
gcc -v
可以看见gcc版本为9
直接安装gcc5会提示找不到源,这是因为在ubuntu20的源中没有gcc5的资源,需要添加旧版本ubuntu的源(以ubuntu16为例)
vim /etc/apt/sources.list
在末尾添加以下内容(阿里云的源,xenial就是ubuntu16的代号)
deb http://mirrors.aliyun.com/ubuntu/ xenial main
deb-src http://mirrors.aliyun.com/ubuntu/ xenial main
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates main
deb http://mirrors.aliyun.com/ubuntu/ xenial universe
deb-src http://mirrors.aliyun.com/ubuntu/ xenial universe
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates universe
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates universe
deb http://mirrors.aliyun.com/ubuntu/ xenial-security main
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security main
deb http://mirrors.aliyun.com/ubuntu/ xenial-security universe
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security universe
保存文件后更新源
apt-get update
查看gcc5可选版本
apt-cache policy gcc-5
显示以下内容(我已经安装gcc5)
gcc-5:
已安装:5.4.0-6ubuntu1~16.04.12
候选: 5.4.0-6ubuntu1~16.04.12
版本列表:
*** 5.4.0-6ubuntu1~16.04.12 500
500 http://mirrors.aliyun.com/ubuntu xenial-updates/main amd64 Packages
500 http://mirrors.aliyun.com/ubuntu xenial-security/main amd64 Packages
100 /var/lib/dpkg/status
5.3.1-14ubuntu2 500
500 http://mirrors.aliyun.com/ubuntu xenial/main amd64 Packages
选择一个候选版本进行安装即可,比如5.4.0-6ubuntu1~16.04.12
apt-get install gcc-5=5.4.0-6ubuntu1~16.04.12
现在ubuntu里就有gcc9和gcc5两个版本了,默认使用的是gcc9
输入以下命令切换gcc5为默认版本
// 设置gcc5的优先级为40
update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-5 40
// 设置gcc9的优先级为50(数字越大优先级越小)
update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 50
// 手动选择gcc5
update-alternatives --config gcc
选择对应编号即可
有 2 个候选项可用于替换 gcc (提供 /usr/bin/gcc)。
选择 路径 优先级 状态
------------------------------------------------------------
0 /usr/bin/gcc-9 50 自动模式
* 1 /usr/bin/gcc-5 40 手动模式
2 /usr/bin/gcc-9 50 手动模式
最后使用 gcc -v查看当前的gcc版本,显示
gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.12)
就配置成功啦
3、如果链接的库可以重新编译,使用高版本gcc重新编译一遍
编译后,如果电脑中同时存在两种版本gcc,切换到高版本gcc仍然编译不成功,这是因为gcc环境损坏,某些文件使用了低版本gcc的文件,此时需要卸载低版本gcc
sudo apt-get remove gcc-5 // 具体版本因人而异
并执行以下命令:
sudo apt-get automove