解决make编译时报错:can not be used when makeing a PIE object;recomplie with -fPIE

问题原因

链接的库使用的低版本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
  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值