1 / 1 / 0
Регистрация: 20.09.2018
Сообщений: 63

Ошибка линковки при интеграции библиотек Bullet Physics

10.09.2023, 10:39. Показов 1272. Ответов 0

Студворк — интернет-сервис помощи студентам
Здравствуйте!
При построении пустого проекта с единственным файлом Source.cpp, содержащим код из файла HelloWorld.cpp из BulletPhysics, возникают ошибки линковки (см. картинку). Код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
#include "btBulletDynamicsCommon.h"
#include <stdio.h>
 
/// This is a Hello World program for running a basic Bullet physics simulation
 
int main()
{
    ///-----includes_end-----
 
    int i;
    ///-----initialization_start-----
 
    ///collision configuration contains default setup for memory, collision setup. Advanced users can create their own configuration.
    btDefaultCollisionConfiguration* collisionConfiguration = new btDefaultCollisionConfiguration();
 
    ///use the default collision dispatcher. For parallel processing you can use a diffent dispatcher (see Extras/BulletMultiThreaded)
    btCollisionDispatcher* dispatcher = new btCollisionDispatcher(collisionConfiguration);
 
    ///btDbvtBroadphase is a good general purpose broadphase. You can also try out btAxis3Sweep.
    btBroadphaseInterface* overlappingPairCache = new btDbvtBroadphase();
 
    ///the default constraint solver. For parallel processing you can use a different solver (see Extras/BulletMultiThreaded)
    btSequentialImpulseConstraintSolver* solver = new btSequentialImpulseConstraintSolver;
 
    btDiscreteDynamicsWorld* dynamicsWorld = new btDiscreteDynamicsWorld(dispatcher, overlappingPairCache, solver, collisionConfiguration);
 
    dynamicsWorld->setGravity(btVector3(0, -10, 0));
 
    ///-----initialization_end-----
 
    //keep track of the shapes, we release memory at exit.
    //make sure to re-use collision shapes among rigid bodies whenever possible!
    btAlignedObjectArray<btCollisionShape*> collisionShapes;
 
    ///create a few basic rigid bodies
 
    //the ground is a cube of side 100 at position y = -56.
    //the sphere will hit it at y = -6, with center at -5
    {
        btCollisionShape* groundShape = new btBoxShape(btVector3(btScalar(50.), btScalar(50.), btScalar(50.)));
 
        collisionShapes.push_back(groundShape);
 
        btTransform groundTransform;
        groundTransform.setIdentity();
        groundTransform.setOrigin(btVector3(0, -56, 0));
 
        btScalar mass(0.);
 
        //rigidbody is dynamic if and only if mass is non zero, otherwise static
        bool isDynamic = (mass != 0.f);
 
        btVector3 localInertia(0, 0, 0);
        if (isDynamic)
            groundShape->calculateLocalInertia(mass, localInertia);
 
        //using motionstate is optional, it provides interpolation capabilities, and only synchronizes 'active' objects
        btDefaultMotionState* myMotionState = new btDefaultMotionState(groundTransform);
        btRigidBody::btRigidBodyConstructionInfo rbInfo(mass, myMotionState, groundShape, localInertia);
        btRigidBody* body = new btRigidBody(rbInfo);
 
        //add the body to the dynamics world
        dynamicsWorld->addRigidBody(body);
    }
 
    {
        //create a dynamic rigidbody
 
        //btCollisionShape* colShape = new btBoxShape(btVector3(1,1,1));
        btCollisionShape* colShape = new btSphereShape(btScalar(1.));
        collisionShapes.push_back(colShape);
 
        /// Create Dynamic Objects
        btTransform startTransform;
        startTransform.setIdentity();
 
        btScalar mass(1.f);
 
        //rigidbody is dynamic if and only if mass is non zero, otherwise static
        bool isDynamic = (mass != 0.f);
 
        btVector3 localInertia(0, 0, 0);
        if (isDynamic)
            colShape->calculateLocalInertia(mass, localInertia);
 
        startTransform.setOrigin(btVector3(2, 10, 0));
 
        //using motionstate is recommended, it provides interpolation capabilities, and only synchronizes 'active' objects
        btDefaultMotionState* myMotionState = new btDefaultMotionState(startTransform);
        btRigidBody::btRigidBodyConstructionInfo rbInfo(mass, myMotionState, colShape, localInertia);
        btRigidBody* body = new btRigidBody(rbInfo);
 
        dynamicsWorld->addRigidBody(body);
    }
 
    /// Do some simulation
 
    ///-----stepsimulation_start-----
    for (i = 0; i < 150; i++)
    {
        dynamicsWorld->stepSimulation(1.f / 60.f, 10);
 
        //print positions of all objects
        for (int j = dynamicsWorld->getNumCollisionObjects() - 1; j >= 0; j--)
        {
            btCollisionObject* obj = dynamicsWorld->getCollisionObjectArray()[j];
            btRigidBody* body = btRigidBody::upcast(obj);
            btTransform trans;
            if (body && body->getMotionState())
            {
                body->getMotionState()->getWorldTransform(trans);
            }
            else
            {
                trans = obj->getWorldTransform();
            }
            printf("world pos object %d = %f,%f,%f\n", j, float(trans.getOrigin().getX()), float(trans.getOrigin().getY()), float(trans.getOrigin().getZ()));
        }
    }
    system("pause");
    ///-----stepsimulation_end-----
 
    //cleanup in the reverse order of creation/initialization
 
    ///-----cleanup_start-----
 
    //remove the rigidbodies from the dynamics world and delete them
    for (i = dynamicsWorld->getNumCollisionObjects() - 1; i >= 0; i--)
    {
        btCollisionObject* obj = dynamicsWorld->getCollisionObjectArray()[i];
        btRigidBody* body = btRigidBody::upcast(obj);
        if (body && body->getMotionState())
        {
            delete body->getMotionState();
        }
        dynamicsWorld->removeCollisionObject(obj);
        delete obj;
    }
 
    //delete collision shapes
    for (int j = 0; j < collisionShapes.size(); j++)
    {
        btCollisionShape* shape = collisionShapes[j];
        collisionShapes[j] = 0;
        delete shape;
    }
 
    //delete dynamics world
    delete dynamicsWorld;
 
    //delete solver
    delete solver;
 
    //delete broadphase
    delete overlappingPairCache;
 
    //delete dispatcher
    delete dispatcher;
 
    delete collisionConfiguration;
 
    //next line is optional: it will be cleared by the destructor when the array goes out of scope
    collisionShapes.clear();
}
При этом сам файл HelloWorld.cpp, поставляемый с движком, собирается нормально.
Я хочу подключить к проекту либы BulletDynamics, BulletCollision и LinearMath. Для этого с репозитория разработчика были скачаны файлы буллита, а затем по инструкции оттуда же был запущен файл build_visual_studio_vr_pybullet_double.b at, в результате чего файлы .sln буллита были сгенерированы. Затем нужные проекты были построены.
Шаги, предпринятые для решения проблемы:
1) Папка с файлами исходного кода добавлена в инклюды проекта в properties, файлы .lib, соответствующие BulletCollision, BulletDynamics и LinearMath добавлены в дополнительные зависимости
2) В properties проектов движка и в properties моего проекта выставлена Runtime Library = /MT
3) Проекты движка собиралсь в определенном порядке: Dynamics->Collision->LinearMath
Миниатюры
Ошибка линковки при интеграции библиотек Bullet Physics  
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.09.2023, 10:39
Ответы с готовыми решениями:

Bullet Physics
Не могу понять как установить этот физический движок, в инструкции написано что надо его скомпилировать через CMake, потом через Visual...

Bullet Physics Library
Здравствуйте! Кто знает физический движок Bullet physics? Кто поможет разобраться с ним, скомпилировать и запустить? Ну конечно не...

VS2013 LNK1104 - ошибка статической линковки библиотек в консольном приложении
Visual Studio 2013. В решении три проекта (C++): консольное приложение и две статических библиотеки. Указываю компоновщику...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.09.2023, 10:39
Помогаю со студенческими работами здесь

Исправить ошибки линковки при подключении библиотек Ilu
Здравствуйте подскажите как исправить, уже 2 день пытаюсь и ничего не получается. Подключил библиотеки в вижак, скинул либы в папку либ,...

Ошибка в модуле физики Bullet при создании проекта Armory3d в Блендер
Добрый день. При сборке проекта с физикой для движка Armory3d в Blender происходит несколько ошибок: Сцену взял из примеров. ...

Определение библиотек для линковки
Есть чужая программа с исходным кодом. Make-файла нет. Как можно определить какой заголовочный файл (&lt;имя&gt;.h) связан с какой...

В чем отличие статической линковки библиотек от динамической?
В чем отличие статической линковки библиотек от динамической?

Ошибка при линковки проекта
Привет. Работаю над созданием небольшого приложения. Создал 2 библиотеки: Settings.dll - без проблем, откомпилилось, собралось. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

Новые блоги и статьи
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru