LNK2001 Ошибка, хотя. cpp компилируется - PullRequest
0 голосов
/ 15 марта 2020

Я работаю над проектом, в котором использую 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   

Но у меня есть только один добавленный файл, и я не могу найти указанный файл во второй раз. Почему файл должен быть указан более одного раза?

Какие еще шаги можно предпринять, чтобы устранить причину проблемы со связыванием?

...