Я работаю над проектом, в котором использую Bullet3 для добавления системы компонентов Physics Simulation к EntityX .
Я получаю ссылку ошибки при компиляции кода, и я не могу понять, почему. И мой заголовок PhysicsSystem.h
, и источник PhysicsSystem.cpp
находятся в проекте, и я вижу, что они оба связаны как .obj в промежуточных файлах.
Файл заголовка PhysicsSystem.h
:
class PhysicsSystem : public entityx::System<PhysicsSystem>, public entityx::Receiver<PhysicsSystem> {
public:
void configure(entityx::EntityManager &entities, entityx::EventManager &events) override;
void update(entityx::EntityManager& entities, entityx::EventManager& events, entityx::TimeDelta dt) override;
void receive(const entityx::ComponentAddedEvent<RigidBody>& event);
void setGravity(ci::vec3 gravity);
btDiscreteDynamicsWorld* getWorld();
private:
btDefaultCollisionConfiguration* mCollisionConfiguration;
btCollisionDispatcher* mDispatcher;
btBroadphaseInterface* mOverlappingPairCache;
btSequentialImpulseConstraintSolver* mBulletSolver;
btDiscreteDynamicsWorld* mDynamicsWorld;
};
и PhysicsSystem.cpp
:
void PhysicsSystem::configure(entityx::EntityManager &entities, entityx::EventManager &events) {
///collision configuration contains default setup for memory, collision setup. Advanced users can create their own configuration.
mCollisionConfiguration = new btDefaultCollisionConfiguration();
///use the default collision dispatcher. For parallel processing you can use a diffent dispatcher (see Extras/BulletMultiThreaded)
mDispatcher = new btCollisionDispatcher(mCollisionConfiguration);
///btDbvtBroadphase is a good general purpose broadphase. You can also try out btAxis3Sweep.
mOverlappingPairCache = new btDbvtBroadphase();
///the default constraint solver. For parallel processing you can use a different solver (see Extras/BulletMultiThreaded)
mBulletSolver = new btSequentialImpulseConstraintSolver();
mDynamicsWorld = new btDiscreteDynamicsWorld(mDispatcher, mOverlappingPairCache, mBulletSolver, mCollisionConfiguration);
mDynamicsWorld->setGravity(btVector3(0.0, 0.0, 0.0));
events.subscribe<entityx::ComponentAddedEvent<RigidBody>>(*this);
}
void PhysicsSystem::update(entityx::EntityManager& entities, entityx::EventManager& events, entityx::TimeDelta dt) {
mDynamicsWorld->stepSimulation(static_cast<float>(dt), 10);
}
void PhysicsSystem::receive(const entityx::ComponentAddedEvent<RigidBody>& event) {
mDynamicsWorld->addRigidBody(event.component->getRigidBody());
}
void PhysicsSystem::setGravity(ci::vec3 gravity) {
if (mDynamicsWorld != nullptr) {
mDynamicsWorld->setGravity(btVector3(gravity.x, gravity.y, gravity.z));
}
else {
std::printf("PhysicsSystem ERROR -- must configure() system before you can set parameters.\n");
}
}
btDiscreteDynamicsWorld* PhysicsSystem::getWorld() {
return mDynamicsWorld;
}
Когда я пытаюсь скомпилировать, я получаю ошибки:
Error LNK2001 unresolved external symbol "public: virtual void __cdecl PhysicsSystem::configure(class entityx::EntityManager &,class entityx::EventManager &)" (?configure@PhysicsSystem@ecs@sitara@@UEAAXAEAVEntityManager@entityx@@AEAVEventManager@5@@Z) PhysicsSystemExample C:\Project\physics\examples\PhysicsSystemExample\vc2013\PhysicsSystemExampleApp.obj 1
Error LNK2001 unresolved external symbol "public: virtual void __cdecl PhysicsSystem::update(class entityx::EntityManager &,class entityx::EventManager &,double)" (?update@PhysicsSystem@ecs@sitara@@UEAAXAEAVEntityManager@entityx@@AEAVEventManager@5@N@Z) PhysicsSystemExample C:\Project\physics\examples\PhysicsSystemExample\vc2013\PhysicsSystemExampleApp.obj 1
Error LNK2019 unresolved external symbol "public: void __cdecl PhysicsSystem::setGravity(struct glm::tvec3<float,0>)" (?setGravity@PhysicsSystem@ecs@sitara@@QEAAXU?$tvec3@M$0A@@glm@@@Z) referenced in function "public: virtual void __cdecl PhysicsSystemExampleApp::setup(void)" (?setup@PhysicsSystemExampleApp@@UEAAXXZ) PhysicsSystemExample C:\Project\physics\examples\PhysicsSystemExample\vc2013\PhysicsSystemExampleApp.obj 1
Соответственно, я получаю предупреждение о ссылке 4042:
Severity Code Description Project File Line Suppression State
Warning LNK4042 object specified more than once; extras ignored PhysicsSystemExample C:\Project\physics\examples\PhysicsSystemExample\vc2013\build\x64\Debug\intermediate\PhysicsSystem.obj 1
Но у меня есть только один добавленный файл, и я не могу найти указанный файл во второй раз. Почему файл должен быть указан более одного раза?
Какие еще шаги можно предпринять, чтобы устранить причину проблемы со связыванием?