【问题标题】:(mingW) Why does g++ not recognise my class definition when compiling a python extension?(mingW) 为什么在编译 python 扩展时 g++ 不能识别我的类定义?
【发布时间】:2011-01-29 23:12:55
【问题描述】:

所以我正在使用 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++ 执行此操作时,它无法找到我在头文件中定义的网格构造函数的定义。

有谁知道我做错了什么?

【问题讨论】:

    标签: c++ python mingw swig


    【解决方案1】:

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

    【讨论】:

    • 嗯。我有一个名为“mesh.cpp”的文件,其中包含该类的实现。我需要单独包含那个吗? (是的,我对 C++ 很陌生)
    • 您需要将其与其他所有内容一起编译。头文件有点像菜单——它们告诉你什么是可用的——但它们(通常)没有任何实际的实现代码。将 .cpp 文件与其余文件一起编译,将实现与头文件中指定的接口配对。
    • 好吧,现在您正在发出一系列命令来编译其他一些文件。只需添加一个命令来编译您的 .cpp 文件,然后在将 .o 文件链接在一起的最后构建步骤中,添加新的 .o 文件。我不确定您使用的是什么工具链,所以我无法提供比这更具体的建议。
    • 好的。我会看看。那些 .o 文件到底是什么?它们是编译步骤之间的某种中间形式吗?
    • @Bartvlb- .o 文件称为“目标文件”。 C++ 编译分几个阶段进行,其中两个目前很重要。在编译期间,编译器生成一个目标文件,其中包含C++文件的编译表示,但没有解析函数之间的任何链接。这是.o 文件。在 链接 期间,链接器 获取所有 .o 文件并确认已定义所有预期函数,然后基于目标代码输出机器代码,但函数引用已解析。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-04
    • 1970-01-01
    • 1970-01-01
    • 2015-09-08
    相关资源
    最近更新 更多