2011-11-07 41 views
0

我想測試用ctypes來包裝dll。我寫了下面的測試代碼,並使用Code :: Blocks和Cygwin將它編譯爲一個dll。Python解釋器在加載DLL時退出

#define DLL_EXPORT extern "C" __declspec(dllexport) 

DLL_EXPORT int sum(int a, int b) { 
    return a + b; 
} 

注意:這是整個代碼。也許有一些缺失?

現在,我將TestDll.dll複製到我的桌面並啓動Python解釋器。但是當我想加載時,解釋器就退出了!

C:\Users\niklas\Desktop>python 
Python 2.7.2 (default, Jun 12 2011, 15:08:59) [MSC v.1500 32 bit (Intel)] on win 32 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import ctypes 
>>> dll = ctypes.WinDLL('TestDll') 

C:\Users\niklas\Desktop> 

但是,加載任何其他庫工作,或者如果無法找到該庫,則會發出錯誤。
你能告訴我我在做什麼錯嗎?

使用Cygwin G ++ 3.4.4

回答

1

檢查objdump -p TestDll.dll | grep dll以查看您是否已鏈接「cygwin1.dll」和nm TestDll.dll | grep Dll以查看是否有DllMain。以下命令應建立正確的DLL:

g++ testdll.c -mno-cygwin -shared -o TestDll.dll 

此外,您還需要使用CDLL爲cdecl調用約定,不WINDLL:

>>> import ctypes 
>>> dll = ctypes.CDLL('TestDll') 
>>> dll.sum(4, 5) 
9 

編輯:我i686-w64-mingw32-g++.exe編譯(4.5.3)從Cygwin存儲庫中,但我曾經使用默認的Cygwin gcc沒有問題,給出了-mno-cygwin選項。

+0

Yippie使用'ctypes.CDLL'修復了在Ignacios post評論中遇到的問題。但即使使用這些命令,使用Cygwin仍然失敗。不,該dll沒有'dllmain'。爲什麼它必須?它使用MinGw沒有它。 :) –

1

作爲一個完整的猜測,我會說,Cygwin的內置DLL是用MSVC建造的解釋不兼容,或者是因爲的ABI問題,或者只是因爲你可以不使用兩個不同的libc。改爲使用MinGW生成DLL。

+0

大聲笑,現在很有趣^^。作品!一般來說。它不會退出!但是'dll.sum'不像預期的那樣需要8個字節,它不需要任何。我需要在沒有任何參數的情況下調用它,並返回'2620428'。謝謝 ! –