У меня проблема с связыванием конструктора constexpr между двумя проектами в одном решении Visual Studio.
У меня есть два проекта в моем решении Visual Studio 2019:
- NES_Core
- NES_Core_Tests
Первый — проект .lib, второй — базовый проект GTest. Оба используют C++17.
У меня есть следующий класс, объявленный в executor.h в NES_Core:
namespace nes::cpu::opcodes::immediate {
class Executor
{
public:
constexpr Executor(registers::Registers& registers) noexcept;
~Executor() = default;
Executor(Executor& rhs) = delete;
Executor(Executor&& rhs) = delete;
Executor& operator=(const Executor& rhs) = delete;
Executor& operator=(Executor&& rhs) = delete;
private:
registers::Registers& registers_;
};
}
И определение в executor.cpp:
namespace nes::cpu::opcodes::immediate {
constexpr Executor::Executor(registers::Registers& registers) noexcept :
registers_(registers)
{
}
}
Позже я пытаюсь создать объект Executor в OpcodesImmediateExecutorTests.cpp в проекте NES_Core_Tests:
#include "pch.h"
#include "nes/cpu/registers/registers.h"
#include "nes/cpu/opcodes/immediate/executor.h"
class OPCodes_ : public ::testing::Test
{
public:
OPCodes_() :
reg_(),
ie_(reg_)
{
}
nes::cpu::registers::Registers reg_;
nes::cpu::opcodes::immediate::Executor ie_;
};
К сожалению, не удается связать:
OpcodesImmediateExecutorTests.obj: ошибка LNK2019: неразрешенный внешний символ "public: __thiscall nes::cpu::opcodes::immediate::Executor::Executor(struct nes::cpu::registers::Registers &)" (??0Executor@ непосредственный@opcodes@cpu@nes@@QAE@AAURegisters@registers@34@@Z), указанный в функции "public: __thiscall OPCodes_::OPCodes_(void)" (??0OPCodes_@@QAE@XZ)
Более того, когда я удаляю ключевое слово constexpr из .h и .cpp, связывание выполняется просто отлично. У вас есть идеи, почему это могло произойти?
constexpr
? Вы понимаете последствия этого? - person Lightness Races in Orbit   schedule 07.08.2019