(mingW) Почему g ++ не распознает мое определение класса при компиляции расширения Python? - PullRequest
1 голос
/ 30 января 2011

Итак, я работаю над небольшим расширением Python, используя библиотеку SWIG. Я использую 3 команды для компиляции расширения. первые 2 используют 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 Ответ

4 голосов
/ 30 января 2011

Похоже, что компилятор просто находит объявление , но не определение . Другими словами, вы создали прототип конструктора, но нигде не реализовали его. Из вывода компилятора не похоже, что вы ссылаетесь в свой файл .cpp, содержащий реализацию, что, вероятно, является причиной этой проблемы.

...