在windows上编译pyd文件但是 "This program cannot be run in DOS mode."

标签 c windows gcc libjpeg pyd

我在Windows上用gcc编译C文件并成功获得pyd文件。令我惊讶的是,它以十六进制显示“此程序无法在 DOS 模式下运行”。虽然我仍然可以从中调用该函数,但程序很快就崩溃了,这是由 libjpeg 库中的 jpeg_read_header() 引起的。

我的问题是到底是什么导致我的程序崩溃。

这是我的猜测:

  1. jpeg_read_header() :我尝试了 jpeg_mem_src() 和 jpeg_stdio_src() 但它仍然崩溃。

    int _read_dct_coefficients(FILE* input_file, int** all_dcts)
    {   
    JDIMENSION i, compnum, rownum, blocknum;
    JBLOCKARRAY row_ptrs[MAX_COMPONENTS];
    size_t block_row_size;
    int num_blocks = 0, cnt = 0;
    
    #ifdef LOG_DEBUG
    log_debug(__LINE__, "enter _read_dct_coefficients");
    #endif
    
    /* init decompression */
    srcinfo.err = jpeg_std_error(&jsrcerr);
    jpeg_create_decompress(&srcinfo);
    
    /* init compression */
    dstinfo.err = jpeg_std_error(&jdsterr);
    jpeg_create_compress(&dstinfo);
    
    jsrcerr.trace_level = jdsterr.trace_level;
    srcinfo.mem->max_memory_to_use = dstinfo.mem->max_memory_to_use;
    
    #ifdef LOG_DEBUG
    log_debug(__LINE__, "%%%%%%%MY TEST # 1%%%%%%%%");
    #endif  
    
    //***************************************************************
    
    unsigned int get_file_size(FILE *fp)  
    {  
        unsigned long filesize = -1;  
        if(fp == NULL)
            return filesize;
        fseek(fp, 0L, SEEK_END);
        filesize = ftell(fp);
        fclose(fp);
        return filesize;
    }
    
    int size = get_file_size(input_file);
    #ifdef LOG_DEBUG
    log_debug(__LINE__, "file size = %d", size);
    #endif
    char *tmp_buf = (unsigned char *)malloc(sizeof(char) * size);
    if (size != fread(tmp_buf, 1, size, input_file))
        log_debug(__LINE__, "cannot open.");
    
    jpeg_mem_src(&srcinfo, tmp_buf, size);
    /*
    jpeg_stdio_src(&srcinfo, input_file);
    */
    #ifdef LOG_DEBUG
    log_debug(__LINE__, "%%%%%%%MY TEST # 2%%%%%%%%");
    #endif  
    jpeg_read_header(&srcinfo, TRUE);
    
    ......
    
    }
    
  2. Pyd 文件:无法在 DOS 模式下运行?

最佳答案

Python .pyd 文件只是一个 DLL,它只是一个 Windows PE 文件。按照惯例,Windows PE 文件以一个 stub 开始,如果您在 DOS 中运行它们,该 stub 会打印该消息:

https://en.wikipedia.org/wiki/Portable_Executable#History

几乎每个 Windows EXE 和 DLL 文件都包含此 header ;它并不意味着任何特别的事情。

关于在windows上编译pyd文件但是 "This program cannot be run in DOS mode.",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20763936/

相关文章:

c++ - 存储无效指针是否自动未定义的行为?

c++ - 当我单击Win32 API中的窗口时,如何打开和关闭弹出菜单?

windows - 有没有办法告诉程序使用的是什么语言?

java - 如何从java捕获错误并打印c程序触发器的流

objective-c - 使用旧 gcc : CFLAG adjustment? 构建 Debian/Ubuntu 软件包

c - gcc 编译器未通过 cmd 在 Windows 中为 C 创建 .exe 文件

c - Raspberry PI,如何配置其他 GPIO 作为 I2C 工作

c - 仅使用一个函数更新全局 C 结构而不传递整个数据结构

c - 表达式 : addition of two value of type unsigned char 的确切类型是什么

windows - DebugView 没有输出