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

1 投票
1 回答
1462 浏览
提问于 2025-04-16 10:52

我正在用SWIG库开发一个小的Python扩展。我用三个命令来编译这个扩展,前两个命令用gcc,最后一个用g++,最终得到了一个Python扩展。我的问题是,gcc编译代码时没有错误,但g++却开始抱怨找不到我的一个类定义(具体细节在下面)。我无法深入调试,因为它抱怨的部分是一个二进制文件。我该如何向g++编译器定义这个类呢?

出问题的代码是一个在名为“cpprenderer.cpp”的文件中的函数,它创建了一个在“mesh.cpp”中定义的mesh类的实例。当然,我有一个头文件来定义这个类,并且在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++执行时,它找不到我在头文件中定义的mesh构造函数。

有没有人知道我哪里出错了?

1 个回答

4

看起来编译器能找到你所说的声明,但找不到定义。简单来说,你已经写了构造函数的原型,但在其他地方没有真正实现它。从编译器的输出信息来看,似乎你没有把包含实现的 .cpp 文件链接进来,这可能就是问题的原因。

撰写回答