SWIG 在为 Java 包装 C++ 时显示错误
SWIG shows error when wrapping C++ for Java
我想使用 SWIG 为 java 包装一个 c++ class。我遵循了 official tutorial and documentation 并试图让它工作,但我遇到了一些错误。
我使用 windows 7 x64.
所以我打开cmd并输入:swig -c++ -java myclass.i
该命令执行并生成了几个文件。(它没有产生错误)
之后,我输入:gcc -c myclass_wrap.cxx -I"C:\Program Files\Java\jdk1.7.0_60\include" -I"C:\Program Files\Java\jdk1.7.0_60\include\win32"
该命令也成功了。 (没有产生错误)
最后,我输入了ld -G myclass_wrap.o -o libmyclass.so
产生了一堆未定义的引用错误,例如:
myclass_wrap.o:myclass_wrap.cxx:<.text+0xa8>: undefined reference to '__cxa_allocate_exception'
这里是我最初的c++代码,下面的c++class:
头文件:
/*myclass.h*/
#define MYCLASS_H
#ifndef MYCLASS_H
#include <vector>
#include <iostream>
class myClass
{
private:
int ID;
std::vector<int> vector;
public:
myClass();
myClass(int id, std::vector<int> v);
void setID(int id);
int getID();
void setVector(std::vector<int> v);
std::vector<int> getVector();
void insertIntoVector(int num);
void printVector();
};
#endif // MYCLASS_H
和 cpp 文件:
/*myclass.cpp*/
#include "myclass.h"
myClass::myClass()
{
ID=0;
vector=std::vector<int>();
}
myClass::myClass(int id, std::vector<int> v)
{
ID=id;
vector=v;
}
void myClass::setID(int id)
{
ID=id;
}
int myClass::getID()
{
return ID;
}
void myClass::setVector(std::vector<int> v)
{
vector=v;
}
std::vector<int> myClass::getVector()
{
return vector;
}
void myClass::insertIntoVector(int num)
{
std::vector<int>::iterator it;
it=vector.end();
vector.insert(it,num);
}
void myClass::printVector()
{
std::vector<int>::iterator it;
for (it=vector.begin(); it<vector.end(); it++)
std::cout << ' ' << *it<< std::endl;
}
和 swig 模块文件:
/*myclass.i*/
%module test
%{
#include "myclass.h"
%}
%include "std_vector.i"
namespace std {
%template(IntVector) vector<int>;
}
%include "myclass.h"
After that, I typed in: gcc -c myclass_wrap.cxx -I"C:\Program
Files\Java\jdk1.7.0_60\include" -I"C:\Program
Files\Java\jdk1.7.0_60\include\win32"
它是 C++ 代码,因此通常更喜欢使用 g++
而不是 gcc
进行编译(尽管并非绝对必要):
g++ -c myclass_wrap.cxx -I"C:\Program Files\Java\jdk1.7.0_60\include" -I"C:\Program Files\Java\jdk1.7.0_60\include\win32"
Finally, I typed in ld -G myclass_wrap.o -o libmyclass.so
which produced bunch of undefined reference errors like:
myclass_wrap.o:myclass_wrap.cxx:<.text+0xa8>: undefined reference to
'__cxa_allocate_exception'
从 SWIG 文档构建共享库的示例不适用于 C++(因此链接器未找到特定于 C++ 的符号),也不适用于 Windows。
假设您正在为 Windows 使用 Mingw 版本的 gcc,请改用以下代码编译 DLL myclass.dll
:
g++ -shared -o myclass.dll myclass_wrap.o
有关使用 Mingw 构建 DLL 的更多信息,see this example on the Mingw site。
另请参阅 this SWIG FAQ page,其中包含有关为各种平台和编译器构建共享库或 DLL 的信息的链接(但请注意,许多示例命令适用于 C 而不是 C++)。
我想使用 SWIG 为 java 包装一个 c++ class。我遵循了 official tutorial and documentation 并试图让它工作,但我遇到了一些错误。 我使用 windows 7 x64.
所以我打开cmd并输入:swig -c++ -java myclass.i
该命令执行并生成了几个文件。(它没有产生错误)
之后,我输入:gcc -c myclass_wrap.cxx -I"C:\Program Files\Java\jdk1.7.0_60\include" -I"C:\Program Files\Java\jdk1.7.0_60\include\win32"
该命令也成功了。 (没有产生错误)
最后,我输入了ld -G myclass_wrap.o -o libmyclass.so
产生了一堆未定义的引用错误,例如:
myclass_wrap.o:myclass_wrap.cxx:<.text+0xa8>: undefined reference to '__cxa_allocate_exception'
这里是我最初的c++代码,下面的c++class: 头文件:
/*myclass.h*/
#define MYCLASS_H
#ifndef MYCLASS_H
#include <vector>
#include <iostream>
class myClass
{
private:
int ID;
std::vector<int> vector;
public:
myClass();
myClass(int id, std::vector<int> v);
void setID(int id);
int getID();
void setVector(std::vector<int> v);
std::vector<int> getVector();
void insertIntoVector(int num);
void printVector();
};
#endif // MYCLASS_H
和 cpp 文件:
/*myclass.cpp*/
#include "myclass.h"
myClass::myClass()
{
ID=0;
vector=std::vector<int>();
}
myClass::myClass(int id, std::vector<int> v)
{
ID=id;
vector=v;
}
void myClass::setID(int id)
{
ID=id;
}
int myClass::getID()
{
return ID;
}
void myClass::setVector(std::vector<int> v)
{
vector=v;
}
std::vector<int> myClass::getVector()
{
return vector;
}
void myClass::insertIntoVector(int num)
{
std::vector<int>::iterator it;
it=vector.end();
vector.insert(it,num);
}
void myClass::printVector()
{
std::vector<int>::iterator it;
for (it=vector.begin(); it<vector.end(); it++)
std::cout << ' ' << *it<< std::endl;
}
和 swig 模块文件:
/*myclass.i*/
%module test
%{
#include "myclass.h"
%}
%include "std_vector.i"
namespace std {
%template(IntVector) vector<int>;
}
%include "myclass.h"
After that, I typed in:
gcc -c myclass_wrap.cxx -I"C:\Program Files\Java\jdk1.7.0_60\include" -I"C:\Program Files\Java\jdk1.7.0_60\include\win32"
它是 C++ 代码,因此通常更喜欢使用 g++
而不是 gcc
进行编译(尽管并非绝对必要):
g++ -c myclass_wrap.cxx -I"C:\Program Files\Java\jdk1.7.0_60\include" -I"C:\Program Files\Java\jdk1.7.0_60\include\win32"
Finally, I typed in
ld -G myclass_wrap.o -o libmyclass.so
which produced bunch of undefined reference errors like:
myclass_wrap.o:myclass_wrap.cxx:<.text+0xa8>: undefined reference to '__cxa_allocate_exception'
从 SWIG 文档构建共享库的示例不适用于 C++(因此链接器未找到特定于 C++ 的符号),也不适用于 Windows。
假设您正在为 Windows 使用 Mingw 版本的 gcc,请改用以下代码编译 DLL myclass.dll
:
g++ -shared -o myclass.dll myclass_wrap.o
有关使用 Mingw 构建 DLL 的更多信息,see this example on the Mingw site。
另请参阅 this SWIG FAQ page,其中包含有关为各种平台和编译器构建共享库或 DLL 的信息的链接(但请注意,许多示例命令适用于 C 而不是 C++)。