导入软件包时出现错误“导入rect时DLL加载失败:%1不是有效的Win32应用程序”

问题描述

我正在使用cython软件包来调用Cpp API,在我的cpp代码中,我正在使用ffmpeg库,并且能够使用贝娄命令成功构建代码

python setup.py build_ext --inplace --compiler=msvc

但是当我尝试导入生成的pyd文件时,我得到了错误

PS D:\SiVUE\Backend\Cython\demo> python
Python 3.8.3 (tags/v3.8.3:6f8c832,May 13 2020,22:20:19) [MSC v.1925 32 bit (Intel)] on win32
Type "help","copyright","credits" or "license" for more information.
>>> import rect
Traceback (most recent call last):
  File "<stdin>",line 1,in <module>
ImportError: DLL load failed while importing rect: %1 is not a valid Win32 application.
>>> 

下面提供了我的完整代码

header file
#ifndef RECTANGLE_H
#define RECTANGLE_H
#include <iostream>

extern "C"
{
    #include "libavformat/avformat.h"
    #include "libavutil/dict.h"
}

using namespace std;

namespace shapes 
{
    class Rectangle {
        public:
            int x0,y0,x1,y1;
            Rectangle();
            Rectangle(int x0,int y0,int x1,int y1);
            ~Rectangle();
            int getArea();
            int ffmpegFile();
            void getSize(int* width,int* height);
            void move(int dx,int dy);
    };
}

#endif
ffmpegFile()中的

Rectangle.Cpp文件,我主要在调用ffmpeg API


#include <iostream>
#include "Rectangle.hpp"

namespace shapes {
    

    // Default constructor
    Rectangle::Rectangle () {}

    // Overloaded constructor
    Rectangle::Rectangle (int x0,int y1) {
        this->x0 = x0;
        this->y0 = y0;
        this->x1 = x1;
        this->y1 = y1;
    }

    // Destructor
    Rectangle::~Rectangle () {}

    // Return the area of the rectangle
    int Rectangle::getArea () {
        return 10;
    }

    // Get the size of the rectangle.
    // Put the size in the pointer args
    void Rectangle::getSize (int *width,int *height) {
        (*width) = x1 - x0;
        (*height) = y1 - y0;
    }

    // Move the rectangle by dx dy
    void Rectangle::move (int dx,int dy) {
        this->x0 += dx;
        this->y0 += dy;
        this->x1 += dx;
        this->y1 += dy;
    }
    int Rectangle::ffmpegFile()
    {
        AVFormatContext *fmt_ctx = NULL;
        AVDictionaryEntry *tag = NULL;
        int ret = 0;
        char* filename = "D:\\Discovery.mp4";

        if ((ret = avformat_open_input(&fmt_ctx,filename,NULL,NULL)))
            return ret;

        if ((ret = avformat_find_stream_info(fmt_ctx,NULL)) < 0) {
            av_log(NULL,AV_LOG_ERROR,"Cannot find stream information\n");
            return ret;
        }

        while ((tag = av_dict_get(fmt_ctx->metadata,"",tag,AV_DICT_IGNORE_SUFFIX)))
            printf("%s=%s\n",tag->key,tag->value);

        avformat_close_input(&fmt_ctx);
        return ret;
    }
}

用于cpp文件功能和变量的Rectangle.pxd文件声明

cdef extern from "Rectangle.cpp":
    pass
cdef extern from "Rectangle.hpp" namespace "shapes":
    cdef cppclass Rectangle:
        Rectangle() except +
        Rectangle(int,int,int) except +
        int x0,y1
        int getArea()
        void getSize(int* width,int* height)
        void move(int,int)
        int ffmpegFile()

rect.pyx文件,我正在调用cpp API

# distutils: language = c++

from Rectangle cimport Rectangle

cdef class PyRectangle:
    cdef Rectangle c_rect  # Hold a C++ instance which we're wrapping

    def __cinit__(self,int x0,int y1):
        self.c_rect = Rectangle(x0,y1)

    def get_area(self):
        return self.c_rect.getArea()

    def get_size(self):
        cdef int width,height
        self.c_rect.getSize(&width,&height)
        return width,height

    def move(self):
        print(self.c_rect.ffmpegFile())

setup.py 我提供了pyx文件和ffmpeg库路径以及包含路径

from distutils.core import setup
from setuptools import Extension
from Cython.Build import cythonize 

sfc_module = [Extension('rect',sources = ['rect.pyx'],include_dirs = ['D:\\SiVUE\\Backend\\Cython\\demo\\ffmpeg\\include\\'],library_dirs = ['D:\\SiVUE\\Backend\\Cython\\demo\\ffmpeg\\lib\\'],libraries = ['avcodec','avdevice','avfilter','avformat','avutil','postproc','swresample','swscale'],language='c++')]

setup(name = 'superfastcode',version = '1.0',description = 'Python Package with superfastcode C++ extension',ext_modules = cythonize(sfc_module),include_dirs = ['D:\\SiVUE\\Backend\\Cython\\demo\\ffmpeg\\include\\']
    )

谢谢

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...