在包装C ++ for Java时,SWIG显示错误

时间:2015-03-18 20:51:48

标签: java c++ cmd swig

我想用SWIG for java包装一个c ++类。我已经关注了official tutorialdocumentation并试图让它发挥作用,但我遇到了一些错误。 我使用的是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 ++类: 头文件:

/*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"

1 个答案:

答案 0 :(得分:1)

  

之后,我输入了: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"

  

最后,我输入了ld -G myclass_wrap.o -o libmyclass.so

     

产生了一堆未定义的引用错误,如:

     

myclass_wrap.o:myclass_wrap.cxx:&lt; .text + 0xa8&gt ;: 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 ++)。