【发布时间】:2016-01-28 19:42:54
【问题描述】:
我是 SWIG 的新手,所以我完全没有这方面的经验,但我真的很想使用 Riftek LASER (https://riftek.com/media/rit/SDK/RFDevice_SDK.zip) 的 SDK。
SDK 本身包含一些头文件、dll 和 def 文件。到目前为止,我已经编写了以下 SWIG 文件:
/* rfdevice.i */
%module rfdevice
%{
#include <windows.i>
#include <typemaps.i>
#include "include/RF625Device.h"
#include "include/RF625Device_Legacy.h"
#include "include/RFDevice.h"
#include "include/RFEthernetDetector.h"
#include "include/RFEthernetDevice.h"
#include "include/RFQDPMotorDevice.h"
#include "include/RFSerialDevice.h"
#include "include/RFString.h"
#include "include/RFTypeDefs.h"
#include "include/serial.h"
%}
%include <windows.i>
%include <typemaps.i>
%apply void *INPUT {void *lpResultBuffer};
%apply float *OUTPUT {float *lpPointsBuffer};
%apply USHORT *OUTPUT {USHORT *lpCount};
%include "include/RFString.h"
%include "include/serial.h"
namespace RFDevice {
%include "include/RFTypeDefs.h"
%include "include/RFEthernetDetector.h"
%include "include/RFDevice.h"
%include "include/RFEthernetDevice.h"
%include "include/RFQDPMotorDevice.h"
%include "include/RFSerialDevice.h"
%include "include/RF625Device_Legacy.h"
%include "include/RF625Device.h"
}
我可以生成 rfdevice_wrap.c 文件,但我无法编译它,因为我从编译器中得到了很多未定义的引用。
我的问题是: - 我必须以某种方式在 i 文件中包含 dll 或 def 文件吗? - 是否有更快/更简单的方法让 SDK 与 Python 一起工作?
我正在使用 g++ 在 Windows 7 64 位下使用 MinGW 进行编译。
到目前为止,我设法确定了我真正的问题。我根据当前状态修改了问题。
其中一个标头中有如下函数定义:
USHORT ConvertResultToPoints(void IN *lpResultBuffer, float OUT *lpPointsBuffer, USHORT OUT *lpCount, USHORT *lpMeasureCnt = NULL, USHORT *lpPacketCnt = NULL, BOOL bChecksumCheck = FALSE);
这里的“IN”和“OUT”给 SWIG 带来了一些麻烦。我不断收到以下编译器错误:
include\RF625Device_Legacy.h(259): Error: Syntax error in input(3).
在参数处理下的 SWIG 文档中,有可能解决该问题。我已经将它包含在 i 文件中,但我不断收到编译器错误。
【问题讨论】:
-
您应该在此处包含来自编译器/链接器的错误消息,请参阅minimal reproducible example
-
为什么要用 g++ 编译 *.c 文件?
-
无法在i(接口)文件中包含dll/def文件,但必须在编译代码时包含它们
-
感谢V大师的回答。 Alexander:SDK 中不包含 *.c 文件。只有 *.h 文件。当我查看文件时,语法看起来更像 C++ 而不是 C。实际上,我使用 g++ 得到的编译器错误比使用 gcc 少。
-
1) 永远不要使用 #include 包含 .i 文件。这没有任何意义,它们不是 C 或 C++ 2) SWIG 不递归标头,因此必须以正确的顺序包含头文件。 3) 不要在命名空间中包含 .i 文件。您得到的语法错误很可能是由于未知的定义,例如出口申报