低版本gcc程序向高版本移植的兼容性问题

薄小成 薄小成     2022-08-07     395

关键词:

将低版本gcc编译过的程序移植到高版本GCC时, 可能会出现一些兼容性问题. 原因是, 为了适应新的标准,一些旧的语法规则被废弃了. 关于这方面的一些具体资料可从该处查询. 这里只是自己遇到的其中一个问题.

错误提示:

In instantiation of ‘int t(T) [with T = int]’
  required from here
  error: ‘f’ was not declared in this scope, and no declarations were found by argument-dependent lookup at the point of instantiation [-fpermissive]
  note: ‘int f(int)’ declared here, later in the translation unit

错误原因:

 The C++ compiler no longer performs some extra unqualified lookups it had performed in the past, namely dependent base class scope lookups and unqualified template function lookups.

C++ programs that depended on the compiler‘s previous behavior may no longer compile. For example, code such as

//foo1.cpp
template<typename T> int t(T i) { return f(i); } int f(int i) { return i; } int main() { return t(1); }

解决方法:

To fix, make sure the function f in the code above is declared before first use in function t. Like so:

//foo2.cpp
int
f(int i) { return i; } template<typename T> int t(T i) { return f(i); } int main() { return t(1); }

意思是说, C++编译器不再支持那种非标准的模板类中函数查找方式,如foo1.cpp所示, 在定义模板类时使用的函数在该模板类之前未定义, 而是在该模板类之后定义. 早期的C++编译器支持向后查找. 但是新标准出来后, 该方式被废除了. 因此会报错. 如foo2.cpp所示, 在模板类中使用某个函数之前应先对该函数进行定义. 这才是正确的姿势.

 Or this can be temporarily worked around by using -fpermissive.

第一种方法方法可以从根本上解决问题, 但是有情况是我们编译别人的程序, 并且程序十分复杂, 不是我们可以轻易改变的. 这时有个临时性的方法, 那便是在编译时添加 -fpermissive 选项. 我自己的项目是利用Cmake进行构建的, 因此只需要在 CmakeList.txt 文件中添加一行: ADD_DEFINITIONS(-fpermissive), 然后重新 cmake 一下即可. 此时将错误降为警告, 可顺利通过编译.

问题排查低版本内核驱动移植到高版本内核中编译报错,部分编译异常记录及解决(代码片段)

摘要:将klsp移植到高版本内核中编译时,有可能会遇到一些编译报错。原因一部分是因为新版本的内核加入了更多的代码检测,或者是打开了更多的代码检测选项,将以前的warning视为了error,还有可能是因为... 查看详情

CUDA 与我的 gcc 版本不兼容

】CUDA与我的gcc版本不兼容【英文标题】:CUDAincompatiblewithmygccversion【发布时间】:2011-10-0103:15:23【问题描述】:我在编译一些随CUDASDK提供的示例时遇到了麻烦。我已经安装了开发者驱动程序(版本270.41.19)和CUDA工具包,最后是S... 查看详情

h5兼容性问题

兼容性问题:1.要发生在低版本的浏览器上,低版本的手机。2.高级曲面屏手机。兼容性问题解决之道:不要用高级省事代码,老老实实写最普通常规的代码。遇到的兼容性问题记录:1.object.assign():js中用了这个方法,低版本手机... 查看详情

gcc低版本换高版本

我的GCC版本太高了,请问怎么把他降低啊?天啊这个是才复制过来的大家帮帮忙啊参考技术A现在安装bbs出现类型冲突,需要用低版本的gcc。好像直接装就行了,源gcc8。想出来的不知道可不可行,装个rpm包管理软件,然后把高版本... 查看详情

android高版本api方法在低版本系统上的兼容性处理

...的方法带来许多便利,但无法在低版本系统上运行,如果兼容性处理不恰当,APP在低版本系统上,运行时将会crash。本文以一个具体的例子说明如何在使用高APIlevel的方法时处理好兼容性问题。例子:根据给出路径,获取此路径... 查看详情

链接使用不同版本的 GCC 构建的目标文件

...述】:我对使用现代版本的GCC4.4.x/4.5.x构建C++库存在一些兼容性问题,其中客户端使用旧版本,例如3.4.x/4.1.x。建议的一种解决方案是编译目标文件并分发它们。然后,客户端可以使用任何版本的GCC和相关ABI进 查看详情

高版本gcc编译出的程序在低版本glibc机器上运行

...考技术A比如我们用gcc9.3.0编译程序,但需要发布的机器gcc版本是4.8.5,怎么办?你可能想到如下方法将libc和libstdc++静态编译,编译时带上如下参数。glibc并不推荐静态链接,你依赖的其他库可能依赖的了glibc,并且往往是动态链... 查看详情

object.create()方法的低版本兼容问题

Object.prototype.create=function(obj){if(Object.prototype.create){returnObject.prototype.create//特性检测,判断浏览器是否兼容}else{functionF(){F.prototype=obj;//以传入参数为原型构造对象returnnewF();}}}; 查看详情

英特尔 C++ 编译器:最高 GCC 版本兼容性是多少?

】英特尔C++编译器:最高GCC版本兼容性是多少?【英文标题】:IntelC++compiler:WhatishighestGCCversioncompatibility?【发布时间】:2015-03-3114:37:53【问题描述】:我正在使用最新的英特尔C++编译器icpc15.0.1(2014-10-23)。-gxx-name编译器选项向icpc... 查看详情

针对ie低版本兼容性问题的一些解决方案

<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metahttp-equiv="X-UA-Compatible"content="IE=edge"><metaname="viewport"content="width=device-width,initial-scal 查看详情

html5新增的语义标签和ie版本低的兼容性问题

<!DOCTYPEhtml><html> <head> <!--HTML5中浏览器兼容(较低版本的IE浏览器不支持H5的布局):需要在<head>中加入 <!-[ifltIE9]><scriptsrc="html5.js"></script><![endif]->(html5.js是外部引入 查看详情

markdown低版本ie兼容问题(代码片段)

查看详情

兼容低版本js的array.map方法

...2标准中新添加的方法,在低版本的JS中是木有的。看如下兼容性实现方式: 实现思路:1,先验证this对象,再将this用Object封装成obj。         查看详情

兼容低版本ie的思路

兼容处理ie低版本,推荐三条路径: 一、csshack,适用于代码初建阶段,也就是说在开发功能之前要思考的问题点,这里总结几个常见的:1、-区分ie6与ie7以上(-text-indent:0; ie6识别)2、*区分标准ie7与ie8以上标准模式(*text... 查看详情

teamviewer提示版本不兼容怎么办?

...安装好了TeamViewer后,然后在家里安装后连接却被提示:版本不兼容。这是什么原因呢?图:软件版本不兼容原来,TeamViewer和其他大多数的软件一样,在版本问题上,都是高级版本兼容低级版本,低级版本无法兼容高级版本的。... 查看详情

jquery不兼容低版本ie浏览器怎么解决?

...Jquery从2.x版本开始已经不再进行IE低版本(IE6、IE7、IE8)的兼容性处理。如果需要兼容低版本的IE版本,建议使用原生JS或者低版本的Jquery1.x版本。2.可以给网页写两套或者多套JS代码以适应不同版本、不同类型的浏览器,然后使用原... 查看详情

如何让vmware低版本运行vmware高版本创建的虚拟机?

...及报错。还是建议大家采用第一种方式(通过兼容版本做兼容性硬件版本转换); 查看详情

如何让vmware低版本运行vmware高版本创建的虚拟机

...及报错。还是建议大家采用第一种方式(通过兼容版本做兼容性硬件版本转换); 参考技术B直接打开VMware虚拟机软件,选择菜单栏“文件”——“打 查看详情