Python ctypes dll在使用库函数时调用访问冲突

时间:2015-03-26 10:00:00

标签: python c dll ctypes access-violation

我有一个包含两个函数的c文件。这个文件用gcc编译成一个dll,然后从python用ctypes调用。简单函数try1()工作正常,但在调用try2()时,它会抛出一个

windows error: access violation when writing 0x0

我的猜测:从包含的库中调用的c库函数存在一些问题:printf,strcpy等。但是malloc和strlen工作得很好......

我该如何解决这个问题?我究竟做错了什么?谢谢! 以下是代码提取:

mylib.c:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int try1(int x)
{
    return x+2;
}
int try2(int x)
{
    char* str;
    str = malloc(strlen("text")+1);   // works
    strcpy(str, "text");              // problematic line
    printf("x: %i\n", x);             // problematic line
    free(str);                        // works
    return x+2;
}

汇编:

gcc -shared -o mylib.dll mylib.c -O3 -Wall

python电话:

import ctypes
mylib = ctypes.cdll.mylib
print mylib.try1(5)    # works fine, prints 7
print mylib.try2(5)    #crashes with the access violation error, if the problematic lines are present.

1 个答案:

答案 0 :(得分:0)

事实证明,问题是: 我使用cygwin的内置gcc在cygwin中构建了dll。它链接了cygwin1.dll运行时,而python的ctypes在某种程度上不能容忍这一点。 当我使用MinGW的gcc构建dll时,它现在都可以使用,因为它使用了Windows运行时。