2010-07-20 3 views
0

해당 헤더 파일을 사용하여 SWIG를 통해 DLL을 래핑하려고합니다. SWIG를 사용하여 인터페이스 .i 파일을 처리하는 동안 구문 오류가 발생합니다. 나는 최소 비 처리 가능한 꿀꺽 꿀꺽 인터페이스 파일이 발견 일으키는 라인 (실제 문제가되는 라인과 일치하지 않습니다 꿀꺽 꿀꺽 오류 메시지가 인쇄의 행 번호)가 무엇인지 추적 후 :함수 유형 "extern __declspec (dllimport) INT __cdecl"은 C/C++ 또는 SWIG에서 의미가 있습니까?

/* example.i */ 
%module example 
%{ 
extern __declspec(dllimport) INT __cdecl function(int argument); 
%} 
extern __declspec(dllimport) INT __cdecl function(int argument); 

어디 프로토 타입을 tern extern __declspec(dllimport) INT __cdecl function(int argument);은 랩하려고했던 헤더 파일에서 가져 왔습니다.

이 유형으로 선언 된 함수는 수십 가지입니다. 당신이 볼 수 있듯이 나는이 유형이 의미가 있는지를 알 수있는 충분한 C 경험을 가지고 있지 않습니다. 헤더 파일은 공급 업체로부터 왔으며 Visual C++ 6을 사용하여 OK 파일을 컴파일합니다. 누군가 나를 명확하게 할 수 있습니까?

답변

2

좋아요 ... 어떤 전화 협약인지 알게되었습니다. 문제는 SWIG 인터페이스 파일을 작성하는 방법이었습니다. 당신이 포장하려는 기능이가는 지역에서

/* example.i */ 
%module example 
%{ 
int __cdecl foo(void);  // function declarations for the function 
int __stdcall foo2(void); // you intend to wrap goes in here 
%} 
int foo(void);   // function you want to wrap goes in here 
int foo2(void);   // without the calling convention 

는 호출 규칙 수정 (__cdecl, __ stdcall을, 등)을 포함 할 수 없습니다. 하지만 나는 포장하기 위해 노력하고 있던 헤더 파일을 수정하고 싶지 않았기 때문에 호출 컨벤션 수식어를 손으로 제거하고 싶지 않았습니다. (새로운 버전과 호환되지 않는 버전의 헤더 파일을 릴리스하는 공급 업체를 상상해보십시오. 헤더를 수정해야합니다. 전부 다시). 해결책은 호출하는 컨벤션 수정자를 #define 정의하는 것입니다. SWIG는 이미이 #define을 포함하는 파일 인 "windows.i"를 제공합니다. 포장하려는 기능이 포함 된 머리글을 포함하기 전에 포함시켜야합니다. 이처럼 : 그것은 기본적으로이 작업을 수행하지 않는 이유

/* example.h */ 
int __cdecl foo(void); 
int __stdcall foo2(void); 

난 그냥 이해가 안

/* example.i */ 
%module example 
%{ 
#include "example.h" 
%} 
%include "windows.i" 
%include "example.h" 

. 그러나 나는 내가 찾은 것에 만족한다. 포인터를 주셔서 감사합니다 ...

+0

meh, RTFM! swig/docs/manual/windows.html "Windows에서 SWIG를 사용할 때 일반적인 문제는 C++ 표준에없는 Microsoft 함수 호출 규칙입니다 .SWIG는 ISO C/C++를 구문 분석하므로 다음과 같은 독점적 인 규칙을 처리 할 수 ​​없습니다. __declspec (dllimport), __stdcall 등이 있습니다. Windows 인터페이스 파일 windows.i가 이러한 호출 규칙을 처리합니다. 파일에는 __int64, BOOL, DWORD 등 일반적으로 사용되는 Windows 관련 유형을 처리하기위한 typemap이 포함되어 있습니다 다른 인터페이스 파일처럼. " –

1

그냥 INT가 문제가되는 것 같습니다. 그것은 매크로입니다. 정의하려면 #include <windows.h>과 같아야합니다. 매우은 일반 int가 아닌 것 같습니다. "extern"은 불필요하므로 모든 컴파일러가 무시합니다.

+0

WinDef.h 실제로 참 typedef INT INT; – dan04

+0

나는 windows.h와 WinDef.h의 모든 조합을 포함하여 시도했지만 게임은 포함하지 않았습니다. 나는 또한 dan04가 설명 된 것처럼 INT를 int로 정의하려고 시도했지만 여전히 아무것도 정의하지 않았습니다. 다른 DLL을 래핑하려고 시도했으며 __cdecl 유형의 함수가 문제인 것 같습니다. 다른 DLL을 사용한 세 번째 시도가 성공적이었습니다. __cdecl 유형이 없었습니다. –

+0

나는 몰라, 오류 메시지의 정확한 텍스트와 문제점을 파악할 수있는 단계의 설명을 볼 필요가있다. 읽기 : http://catb.org/esr/faqs/smart-questions.html –