(mingW)为什么在编译python扩展时g ++不能识别我的类定义?

时间:2011-01-29 23:12:55

标签: c++ python mingw swig

所以我正在使用SWIG库开发一个小的python扩展。我使用3个命令来编译扩展。前两个使用gcc,最后一个使用g ++,结果给出了python扩展。我的问题是,在gcc编译没有错误的代码后,g ++开始抱怨它找不到我的一个类定义(下面有更多细节)。我无法调试它,因为它实际上抱怨的部分是二进制文件。我该如何定义g ++编译器的类?

提供问题的代码包含一个名为“cpprenderer.cpp”的文件中的函数,该函数创建一个类网格的实例,在“mesh.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 ++做了它的事情时,它无法找到我在我的头文件中定义的网格构造函数的定义。

有谁知道我做错了什么?

1 个答案:

答案 0 :(得分:4)

看起来编译器正好找到声明,但不是定义。换句话说,你已经构建了构造函数的原型,但是你没有在任何地方实现它。从编译器输出看起来你似乎没有在包含实现的.cpp文件中进行链接,这可能是导致此问题的原因。