Форум программистов, компьютерный форум, киберфорум
Программирование мультимедиа
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
1 / 1 / 0
Регистрация: 20.09.2018
Сообщений: 63

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

10.09.2023, 10:39. Показов 1231. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru