用Cygwin编译并从Python调用的C程序挂起

发布于 2021-01-29 15:05:14

我正在尝试使用从Python调用ac程序ctypes。我在下面有一个最低限度的(非工作)示例。

C程序

这是我要调用的C程序。只是您的标准hello world程序。我在Windows上使用eclipse和cygwin
gcc编译器对此进行编译以生成.dll文件。

主文件

#ifndef INC_MAIN_H_
#define INC_MAIN_H_

void helloWorld();

unsigned char buf[] = "Hello World!";

#endif /* INC_MAIN_H_ */

main.c

#include <stdio.h>
#include "main.h"

void helloWorld(){
    printf("\n%s\n\n", buf);
}

Python程序

然后,我编写一个python脚本来加载我的脚本.dll并调用该helloWorld函数。重要的是,我要同时覆盖.dll我创建的和cygwin1.dll

helloWorld.py

from ctypes import CDLL
import os

def loadDLL(file):
    file = file.replace('\\','/')
    if not os.path.exists(file):
        raise FileNotFoundError(file)

    print('Opening DLL File:', file)
    dll = CDLL(file)

    return dll

if __name__ == '__main__':
    dll = loadDLL(FILE_TO_LOAD)
    dll.helloWorld()

当我去运行该程序时,loadDLL可以正常工作并加载DLL。但是,helloWorld从c程序调用该函数会导致其挂起。

奇怪的是,如果我用printf无害的东西(例如int x = 0)替换了该行,它执行得很好,但会打印出一个看似随机的数字。

谁能指出我做错了什么?甚至是找出问题所在的方法?

顺便说一句,我能够获得几乎相同的设置,以便在Linux系统上正常工作,因此,我猜测这是由于设置了Windows环境造成的,但我无法开始猜测它的真正含义。

更新

我之所以不将其写为答案,因为它不能解决问题的实质,而只能解决精神问题。

让-弗朗索瓦·法布尔(Jean-Francois
Fabre)的建议下,
我放弃了cygwin来使用mingw,现在一切正常。显然,cygwin的工作方式很奇怪。Ahmed
Masud
能够找到有关将cygwin程序用于外部库时应如何编译的有用链接,但这似乎比仅使用mingw麻烦得多(更不用说我已经遇到的其他问题了)尝试为此使用cygwin)。

FWIW,此程序也必须在命令行上运行才能查看c程序的输出。在python的IDLE中运行无法捕获printfc程序的输出。

关注者
0
被浏览
54
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    问题是您正在从NOT cygwin python调用cywgin程序,并且期望值错误。

    cygwin程序具有与普通Windows程序不同的范式(类似于Posix)。

    建议同时使用cygwin python和编译器,或者同时使用Windows一台进行测试。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看