2011-01-29 2 views
1

私はSWIGライブラリを使用して小さなpython拡張機能に取り組んでいます。私は3つのコマンドを使用して拡張機能をコンパイルします。最初の2つはgccを使用し、最後の1つはg ++を使用し、結果としてPython拡張を与えます。私の問題は、gccがエラーなしでコードをコンパイルした後、g ++がクラス定義の1つを見つけることができないと文句を言うようになります(詳細は下記参照)。私はそれを本当にデバッグすることはできません。なぜなら、実際にはバイナリファイルであるということです。クラスをg ++コンパイラにどのように定義するのですか?(mingW)Python拡張モジュールをコンパイルするときにg ++が私のクラス定義を認識しないのはなぜですか?

問題を引き起こすコードは、 "mesh.cpp"で定義されたクラスメッシュのインスタンスを作成する "cpprenderer.cpp"というファイル内の関数で構成されています。もちろん、私はそのクラスを定義するヘッダーファイルを持っていて、cpprenderer.cppからそのファイルにリンクしています。

マイコード:cpprenderer.cppから 抜粋:

#include "src/mesh.h" 
int addMesh() 
{ 
    int newMesh = displayList.size(); 
    mesh meshObj = mesh(); 
    displayList.push_back(meshObj); 
    return newMesh; 
} 

そして、これは完全なmesh.hヘッダファイルです:

class mesh 
{ 
public: 
    mesh(void); 
    void render(void); 
    int createGroup(void); 

    float rotationX; 
    float rotationY; 
    float rotationZ; 

    float x; 
    float y; 
    float z; 
}; 

最後に、これらは私が使用するコマンドであり、どのようなその出力は次のようになります。

C:\Users\Bart\Desktop\swig test>cd C:\Users\Bart\Desktop\swig test 
C:\Users\Bart\Desktop\swig test>C:\swig\swig.exe -python -c++ cpprenderer.i 
C:\Users\Bart\Desktop\swig test>c:\MinGW\bin\gcc.exe -mno-cygwin -mdll -O -Wall -IC:\python26\include -IC:\python26\PC -c cpprenderer_wrap.cxx -o build\temp.win32-2. \Release\cpprenderer_wrap.o "-lopengl32 -lglu32 -lgdi32 -lglut32" 
C:\Users\Bart\Desktop\swig test>c:\MinGW\bin\gcc.exe -mno-cygwin -mdll -O -Wall -IC:\python26\include -IC:\python26\PC -c cpprenderer.cpp -o build\temp.win32-2.6\Release\cpprenderer.o "-lopengl32 -lglu32 -lgdi32 -lglut32" 
C:\Users\Bart\Desktop\swig test>c:\MinGW\bin\g++.exe -mno-cygwin -shared -s build\temp.win32-2.6\Release\cpprenderer_wrap.o build\temp.win32-2.6\Release\cpprenderer.o -LC:\python26\libs -LC:\python26\PCbuild -lpython26 -lmsvcr90 -lopengl32 -lglu32 -lgdi32 -lglut32 -o "C:\Users\Bart\Desktop\swig test\_cpprenderer.pyd" 
build\temp.win32-2.6\Release\cpprenderer.o:cpprenderer.cpp:(.text+0x697): undefined reference to `mesh::mesh()' 
collect2: ld returned 1 exit status 

gccが私のコードの罰金をコンパイルあなたが見ることができるように、しかしときG ++私のメッシュコンストラクタの定義を見つけることができません。ヘッダファイルで定義します。

誰かが私が間違っていることを知っていますか?

答えて

4

コンパイラが宣言を見つけているようですが、の定義はではありません。つまり、コンストラクタのプロトタイプを作成しましたが、どこにでも実装していません。コンパイラの出力からは、この問題の原因と考えられる実装を含む.cppファイルにリンクしているようには見えません。

+0

Hm。私はクラスの実装を持っている "mesh.cpp"と呼ばれるファイルを持っています。私はそれを別々に含める必要がありますか? (ええ、私はC++を初めて使っています) – Bartvbl

+0

他のものと一緒にコンパイルする必要があります。ヘッダーファイルはメニューのようなもので、利用可能な情報を示しますが、実際の実装コードはありません(多くの場合)。残りのファイルと一緒に.cppファイルをコンパイルすると、ヘッダーファイルで指定されたインターフェイスで実装がペアになります。 – templatetypedef

+0

それは多分愚かな質問かもしれませんが、どうしたらいいですか? – Bartvbl

関連する問題