У меня есть рабочий код, использующий 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
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
(неквалифицированная).
Похожие вопросы
Новые вопросы
c++
C ++ - это язык программирования общего назначения. Первоначально он был разработан как расширение C и имеет аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде (который должен быть) скомпилирован с помощью компилятора C ++. Используйте тег для конкретной версии для вопросов, связанных с конкретной версией стандарта [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] или [C ++ 23] и т. Д. .