У меня есть рабочий код, использующий GLFW на C ++. Теперь я хочу использовать его с Qt. Я использую класс, наследующий QOpenGLWidget. Проблема в том, что в моих файлах utils.h и main.cpp есть несколько ошибок определения для всех функций в них, в то время как они определены только один раз.

Сделать журнал:

Makefile:597: warning: overriding recipe for target 'main.o'
Makefile:432: warning: ignoring old recipe for target 'main.o'
g++ -Wl,-O1 -o Rachaita3DFrontend main.o mainwindow.o oglwidget.o main.o moc_mainwindow.o   -lGLEW -lglfw -lGLX -lSOIL -lstdc++ -lQt5Widgets -lQt5Gui -lQt5Core /usr/lib/x86_64-linux-gnu/libGL.so -lpthread   
/usr/bin/ld: main.o: in function `ToCompleteEntity(DataStructs::Type*, DataStructs::Position*, DataStructs::Rotation*, DataStructs::Scale*, DataStructs::Mesh*, DataStructs::Shader*)':
main.cpp:(.text+0x0): multiple definition of `ToCompleteEntity(DataStructs::Type*, DataStructs::Position*, DataStructs::Rotation*, DataStructs::Scale*, DataStructs::Mesh*, DataStructs::Shader*)'; main.o:main.cpp:(.text+0x0): first defined here
/usr/bin/ld: main.o: in function `LoadTexture(char const*, int, int, MeshInstance)':
main.cpp:(.text+0x130): multiple definition of `LoadTexture(char const*, int, int, MeshInstance)'; main.o:main.cpp:(.text+0x130): first defined here
/usr/bin/ld: main.o: in function `key_callback(GLFWwindow*, int, int, int, int)':
main.cpp:(.text+0x270): multiple definition of `key_callback(GLFWwindow*, int, int, int, int)'; main.o:main.cpp:(.text+0x270): first defined here
/usr/bin/ld: main.o: in function `Update()':
main.cpp:(.text+0x290): multiple definition of `Update()'; main.o:main.cpp:(.text+0x290): first defined here
/usr/bin/ld: main.o: in function `gl()':
main.cpp:(.text+0x2a0): multiple definition of `gl()'; main.o:main.cpp:(.text+0x2a0): first defined here
/usr/bin/ld: main.o:(.bss+0x10): multiple definition of `window'; main.o:(.bss+0x10): first defined here
/usr/bin/ld: main.o:(.bss+0x8): multiple definition of `shader'; main.o:(.bss+0x8): first defined here
/usr/bin/ld: main.o:(.bss+0x0): multiple definition of `mesh'; main.o:(.bss+0x0): first defined here
/usr/bin/ld: main.o: in function `resize(int, int)':
main.cpp:(.text+0x390): multiple definition of `resize(int, int)'; main.o:main.cpp:(.text+0x390): first defined here
/usr/bin/ld: main.o: in function `LoadToVAO(std::vector<float, std::allocator<float> >, std::vector<unsigned int, std::allocator<unsigned int> >, std::vector<float, std::allocator<float> >, char const*, int, int)':
main.cpp:(.text+0x3a0): multiple definition of `LoadToVAO(std::vector<float, std::allocator<float> >, std::vector<unsigned int, std::allocator<unsigned int> >, std::vector<float, std::allocator<float> >, char const*, int, int)'; main.o:main.cpp:(.text+0x3a0): first defined here
/usr/bin/ld: main.o: in function `vecTofloat(std::vector<glm::vec<2, float, (glm::qualifier)0>, std::allocator<glm::vec<2, float, (glm::qualifier)0> > >)':
main.cpp:(.text+0xba0): multiple definition of `vecTofloat(std::vector<glm::vec<2, float, (glm::qualifier)0>, std::allocator<glm::vec<2, float, (glm::qualifier)0> > >)'; main.o:main.cpp:(.text+0xba0): first defined here
/usr/bin/ld: main.o: in function `vecTofloat(std::vector<glm::vec<3, float, (glm::qualifier)0>, std::allocator<glm::vec<3, float, (glm::qualifier)0> > >)':
main.cpp:(.text+0xca0): multiple definition of `vecTofloat(std::vector<glm::vec<3, float, (glm::qualifier)0>, std::allocator<glm::vec<3, float, (glm::qualifier)0> > >)'; main.o:main.cpp:(.text+0xca0): first defined here
/usr/bin/ld: main.o: in function `loadOBJ(char const*, char const*, int, int)':
main.cpp:(.text+0xe20): multiple definition of `loadOBJ(char const*, char const*, int, int)'; main.o:main.cpp:(.text+0xe20): first defined here
/usr/bin/ld: main.o: in function `initGL()':
main.cpp:(.text+0x1b30): multiple definition of `initGL()'; main.o:main.cpp:(.text+0x1b30): first defined here
/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/8/../../../x86_64-linux-gnu/Scrt1.o: in function `_start':
(.text+0x20): undefined reference to `main'
/usr/bin/ld: oglwidget.o: in function `OGLWidget::initializeGL()':
oglwidget.cpp:(.text+0x61): undefined reference to `GL::initGL()'
/usr/bin/ld: oglwidget.o: in function `OGLWidget::paintGL()':
oglwidget.cpp:(.text+0x71): undefined reference to `GL::gl()'
/usr/bin/ld: oglwidget.o: in function `OGLWidget::resizeGL(int, int)':
oglwidget.cpp:(.text+0x85): undefined reference to `GL::resize(int, int)'
collect2: error: ld returned 1 exit status
make: *** [Makefile:167: Rachaita3DFrontend] Error 1

Вот простой пример того же.

Main1.cpp:

#include "utils1.h"
#include "main1.h"

void printSomething2{
    printSomething();
}

Main1.h:

#ifndef MAIN1_H_INCLUDED
#define MAIN1_H_INCLUDED

class foo{
    public:
        static void printSomething();
};

#endif

Utils1.h:

#ifndef UTILS1_H_INCLUDED
#define UTILS1_H_INCLUDED

#include <iostream>

void printSomething(){
    std::cout<<"something.";
}

#endif

Файл Example.cpp вызывает printSomething ()

#include "main1.h"

int main(){
    foo::printSomething();
    return 0;
}

Журнал GCC после компиляции Example.cpp:

/usr/bin/ld: /tmp/cc4ft1pF.o: in function `main':
Ogl1.cpp:(.text+0x5): undefined reference to `foo::printSomething()'
collect2: error: ld returned 1 exit status
0
SarojKr 17 Ноя 2019 в 12:06

1 ответ

Лучший ответ

Эта команда неверна:

g++ -Wl,-O1 -o Rachaita3DFrontend main.o mainwindow.o oglwidget.o main.o moc_mainwindow.o -lGLEW -lglfw -lGLX -lSOIL -lstdc++ -lQt5Widgets -lQt5Gui -lQt5Core /usr/lib/x86_64-linux-gnu/libGL.so -lpthread

Он не должен иметь main.o дважды. Вы допустили ошибку где-то в конфигурации сборки (не в исходном коде). Предупреждения предполагают, что у вас есть две разные записи для main.o в вашем Makefile.

Проблема в вашем "простом примере" в конце заключается в том, что вы никогда не определяете foo::printSomething. Это функция, отличная от printSomething (неквалифицированная).

0
M.M 17 Ноя 2019 в 11:06