微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何解决:lto1:致命错误:LTO版本6.0而不是预期的7.1生成的文件“ ...”中的字节码流

如何解决如何解决:lto1:致命错误:LTO版本6.0而不是预期的7.1生成的文件“ ...”中的字节码流

我正在尝试将简单的(测试)Python脚本嵌入C ++。请参阅以下问题以供参考:Undefined reference to `main` error when embedding Python in C++我正试图将Python嵌入C ++。这是我的Python文件名称为EmbedTest.py):

from __future__ import division

class model:  
    def init(self,a,b):  
        self.a = a  
        self.b = b  
         def test_method(a,b):  
    m = model(a,b)  
    m.add(1)  
    print("a: ","b: ",b)  
    return (a+b,a-b,a*b)

这是我的C ++文件名称为EmbedTest.cpp,与EmbedTest.py位于同一文件夹中)

#include <Python.h>  

int main(int argc,char *argv[]) {  
    PyObject *pName,*pModule,*pFunc;  
    PyObject *pArgs,*pValue,*pValue_1,*pValue_2;  
    double sum,diff,prod;  
    double a = atof(argv[1]);  
    double b = atof(argv[2]);   
    Py_Initialize();  
    pName = PyUnicode_DecodeFSDefault("EmbedTest.py");  
    pModule = PyImport_Import(pName);  
    Py_DECREF(pName);  

    if(pModule != NULL) {
      pFunc = PyObject_GetAttrString(pModule,"test_method");    
      if(pFunc && PyCallable_Check(pFunc)) {  
          pArgs = PyTuple_New(2);  
          pValue_1 = PyFloat_FromDouble(a);  
          pValue_2 = PyFloat_FromDouble(b);  
          if (!pValue_1) {
          Py_DECREF(pArgs);
            Py_DECREF(pModule);
        fprintf(stderr,"Cannot convert argument\n");
        return 1;  
        }  
        if (!pValue_2) {
        Py_DECREF(pArgs);
        Py_DECREF(pModule);
        fprintf(stderr,"Cannot convert argument\n");
        return 1;  
        }  
        PyTuple_SetItem(pArgs,pValue_1);  
        PyTuple_SetItem(pArgs,1,pValue_2);  
        
        pValue = PyObject_CallObject(pFunc,pArgs);  
            Py_DECREF(pArgs);  
            if (pValue != NULL) {
            sum = PyFloat_AsDouble(PyTuple_GetItem(pValue,0));
            diff = PyFloat_AsDouble(PyTuple_GetItem(pValue,1));
            prod = PyFloat_AsDouble(PyTuple_GetItem(pValue,2));  
              printf("a: %f b: %f sum: %f diff: %f prod: %f",b,sum,prod);  
              Py_DECREF(pValue);  
            }  
            else {  
                Py_DECREF(pFunc);  
                Py_DECREF(pModule);  
                PyErr_Print();  
                fprintf(stderr,"Call Failed\n");  
                return 1;  
            }       
          } else {  
              if (PyErr_Occurred())  
                PyErr_Print();  
              fprintf(stderr,"Cannot find function \"%s\"\n",argv[2]);  
          }  
          Py_XDECREF(pFunc);  
          Py_DECREF(pModule);  
        }  
        else {  
          PyErr_Print();  
          fprintf(stderr,"Failed to load \"%s\"\n",argv[1]);  
          return 1;  
    }  
    if (Py_FinalizeEx() < 0) {  
        return 120;  
    }  
    return 0;  }

我尝试通过运行来编译和链接

gcc -c $(python3.8-config --cflags --embed) EmbedTest.cpp

gcc EmbedTest.o $(python3.8-config --embed --ldflags)

python3.8-config --cflags扩展到

-I/home/MyUserName/anaconda3/include/python3.8 -I/home/MyUserName/anaconda3/include/python3.8  -Wno-unused-result -Wsign-compare -march=nocona -mtune=haswell -ftree-vectorize -fPIC -fstack-protector-strong -fno-plt -O3 -ffunction-sections -pipe -isystem /home/mbm/anaconda3/include -fdebug-prefix-map=/tmp/build/80754af9/python_1593706424329/work=/usr/local/src/conda/python-3.8.3 -fdebug-prefix-map=/home/MyUserName/anaconda3=/usr/local/src/conda-prefix -fuse-linker-plugin -ffat-lto-objects -flto-partition=none -flto -DNDEBUG -fwrapv -O3 -Wall

python3.8-config --ldflags扩展到的位置

 python3.8-config --ldflags
-L/home/MyUserName/anaconda3/lib/python3.8/config-3.8-x86_64-linux-gnu -L/home/MyUserName/anaconda3/lib  -lcrypt -lpthread -ldl  -lutil -lrt -lm -lm 

但是,我收到以下错误消息:

lto1: Fatal error: bytecode stream in file ‘/home/MyUserName/anaconda3/lib/python3.8/config-3.8-x86_64-linux-gnu/libpython3.8.a’ generated with LTO version 6.0 instead of the expected 7.1
compilation terminated.
lto-wrapper: Fatal error: gcc returned 1 exit status
compilation terminated.
/usr/bin/ld: error: lto-wrapper Failed
collect2: error: ld returned 1 exit status

我知道这与链接时间优化以及python代码似乎是用gcc的旧版本编译的事实有关。我的gcc版本是8.3.0。为了解决这个问题,我尝试重新编译,但删除了所有多余的标志(与LTO有关)。所以我尝试了

gcc -c -I/home/MyUserName/anaconda3/include/python3.8 -I/home/MyUserName/anaconda3/include/python3.8 EmbedTest.cpp
gcc EmbedTest.o $(python3.8-config --embed --ldflags)

但是我得到和以前一样的错误信息。知道如何解决这个问题吗?

解决方法

使用-fno-lto关闭LTO可以解决此问题。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。