powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / undefined reference. Я что-то забыл написать? посмотрите свежим опытным глазом пожалуйста
3 сообщений из 3, страница 1 из 1
undefined reference. Я что-то забыл написать? посмотрите свежим опытным глазом пожалуйста
    #38506191
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет.

Пишу код... вроде всё как надо, а на функцию ругается... В кратце, есть 3 библиотеки (.so), структура не хитрая, одна из них - это основа для двух других (то есть туда вынесено всё, что может потребоваться в любой из двух других библиотек).

Но при вызове одной из функций класса в библиотеке-потомке получаю ошибку "/usr/bin/ld: CMakeFiles/gameengine.dir/main.o: undefined reference to symbol '_ZN12modelsHolder11loadObjectsEP8GLObjectj'", но при этом не могу найти где ошибка.
По коду, класс-предок, от которого наследуемся:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
  class modelsHolder{
    protected:
      std::map<char*, GLMaterial> materials;
      GLObject** objects;
      int objects_num;
    public:
      modelsHolder(void);
      void loadModel(GLPoint* vertex, int vertex_num, GLPoint pos, unsigned int group, char** materials, unsigned short facesNum);
      void loadObjects(GLObject* objects, unsigned int objectsNum);
      void rotateObject(int obj_num, float x, float y, float z, float angle);
      unsigned int getObjectsNum(void);
      unsigned int getObjectGroup(unsigned int num);
      void addMaterial(char* name, GLMaterial material);
  };



из реализации интересует только функция loadObjects, так как именно при вызове её получаю данную ошибку, всё остальное работает как надо. Потому вот её реализация:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
using namespace std;

#include "common3d.h"

extern "C++"
{
...

      void modelsHolder::loadObjects(GLObject* objects, unsigned int objectsNum){
	for(int objNum=0; objNum<objectsNum; objNum++){
	  for(int i=0; i<this->objects_num; i++){
	    if(this->objects[i]==NULL){
	      this->objects[i]=&objects[objNum];
	      return;
	    }
	  }
	  this->objects[this->objects_num]=&objects[objNum];
	  this->objects_num++;
	}
      }

...
}



Класс потомок:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
  class draw3D: public modelsHolder{
  private:
    void rotateAndMoveScene(GLPoint pos, GLPoint up, float angle);
    void setMaterial(char* materialName);
    
  public:
    
    static draw3D* mainObject;
    
    draw3D(int* argc, char** argv, GLPoint left_bottom_near, GLPoint right_top_far, bool smoth);
    void run();
    static void display();
    static void updateScreen(int i);
    void setLightPosDir(GLPoint4 pos, GLPoint dir, float angle);
    
    float angle;
  };



ну и конструктор тоже наследовал разумеется по всем правилам:
Код: plaintext
1.
2.
3.
draw3D::draw3D(int* argc, char** argv, GLPoint left_bottom_near, GLPoint right_top_far, bool smooth): modelsHolder(){
...
}



А теперь самое интересное, код, приводящий к этой ошибке (итак, тут думаю всё понятно, есть общая библиотека, библиотека в которой используется эта общая и сама программа, к которой подключена вторая библиотека):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
int main(int argc, char **argv) {
  draw3D drawObject(&argc, argv, {x: -0.3, y: -0.3, z: 0.5}, {x: 0.3, y: 0.3, z: 160000.0}, true); //тут всё норм
  drawObject.setLightPosDir({x: 30000.0, y: 80000.0, z: 0.0, a: 1.0}, {x: -1.0, y: -1.0, z: 0.0}, 80.0); //всё норм
  GLObject* fl = new GLObject[1]; //возможно тут немного говнокода... только учусь ведь, конструкции языка не все знаю и т.д. ))
  fl->vertex_num = 6;
  fl->group=0;
  fl->material=NULL;
  fl->angle=0.0;
  fl->up={x:0, y:1, z:0};
  fl->position={x:0, y:-10000, z:50000};
  fl->show=true;
  fl->vertex = new GLPoint[6];
  fl->vertex[0] = {x: -50000, y: -10000, z:-50000};
  fl->vertex[1] = {x: 50000, y: -10000, z:50000};
  fl->vertex[2] = {x: -50000, y: -10000, z:50000};
  fl->vertex[3] = {x: -50000, y: -10000, z:-50000};
  fl->vertex[4] = {x: 50000, y: -10000, z:-50000};
  fl->vertex[5] = {x: 50000, y: -10000, z:50000};
  
  drawObject.loadObjects(fl, 1); //тут описанная ошибка, но если эту строку закоментить остальной код работает
  drawObject.run(); 
}



Может вы видите причину ошибки?
...
Рейтинг: 0 / 0
undefined reference. Я что-то забыл написать? посмотрите свежим опытным глазом пожалуйста
    #38506206
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ухты... поправил CMakeLists.txt, добавив туда
find_library(common3d libcommon3d.so /home/programer/projects/common3D/build/)
target_link_libraries(gameengine ${common3d})

и ошибка пропала... То есть библиотека common3d просто не была прилинкована. Но вот вопрос, почему...? Ведь она прилинкована к draw3d, а та прилинкована к gameengine. Или я чего-то не понимаю в процедуре линковки? То есть, если я наследую класс от другого находящегося в другой библиотеке, то мне надо линковать не только файл с основным классом, но и с классом-предком?

А по какому принципу тогда работает та же библиотека glut например? Ведь подключая её, я сразу получаю в рапоряжение и все функции находящиеся в библиотеке libGL (и не только).

То есть как сделать так, что бы в основном приложении не надо было бы линковать все вспомагательные библиотеки, методы из которых не вызываются напрямую из основного приложения?
...
Рейтинг: 0 / 0
undefined reference. Я что-то забыл написать? посмотрите свежим опытным глазом пожалуйста
    #38506237
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Програмёр,

если ты ищешь draw3d так же как common3d через find_library, то find_library не ресолвит зависимости. Хочешь, напиши свой скрипт на CMake, который ищет не только саму библиотеку, но и зависимости. Вообщем, дерзай, а не задавай абстрактных вопросов "как мне сделать, чтобы ничего не делать"
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / undefined reference. Я что-то забыл написать? посмотрите свежим опытным глазом пожалуйста
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]