Проблема специфична для VS2010. Я не мог воспроизвести это в простом случае, чтобы дать MCVE (см. ниже).
Есть какой-то старый, унаследованный проект. Он имеет (среди прочего) 3 проекта C++:
GoogleTestingFramework – проект
.lib
, в котором реализованы функцииGTest
иGMock
. Создан для простоты использования.OldLegacyProject – старый проект
.exe
.- The entities on interest here are
Class1
andClass2
. Both are in separate files,Class1.cpp
+Class1.hpp
(the same for Class2).
- The entities on interest here are
OldLegacyProjectUnitTests – новый проект
.exe
с модульными тестами, написанными с использованиемGTest
иGMock
.- This project is referencing
GoogleTestingFramework
andOldLegacyProject
using Project References. - In the reference properties, I follow the rules from
Visual Studio 2010 not autolinking static libraries from projects that are dependencies as it should be supposed to , especially this part:
- I tried to change
Use Library Dependency Inputs
totrue
, but it didn't change anything regarding the problem
- I tried to change
- классы из этого проекта используют
Class1
иClass2
напрямую (поскольку они являются для них модульными тестами) и должны быть связаны с их.obj
- This project is referencing
Когда я пытаюсь собрать все, я получаю следующие ошибки лайкера:
3>OldLegacyProjectUnitTests.obj : error LNK2019: unresolved external symbol "public: __thiscall Class1::Class1(class Class2 &)" (??0Class1@@QAE@AAVClass2@@@Z) referenced in function "private: virtual void __thiscall SimpleCase_Should_CreateNewInstance_When_Called_Test::TestBody(void)" (?TestBody@SimpleCase_Should_CreateNewInstance_When_Called_Test@@EAEXXZ)
3>OldLegacyProjectUnitTests.obj : error LNK2019: unresolved external symbol "public: __thiscall Class2::Class2(void)" (??0Class2@@QAE@XZ) referenced in function "private: virtual void __thiscall SimpleCase_Should_CreateNewInstance_When_Called_Test::TestBody(void)" (?TestBody@SimpleCase_Should_CreateNewInstance_When_Called_Test@@EAEXXZ)
3>../Debug/OldLegacyProjectUnitTests.exe : fatal error LNK1120: 2 unresolved externals
Я создал простой пример, используя руководство: Тест Google № 1.b: Настройте Googletest в Visual Studio с той же конфигурацией, что и выше, и все будет работать правильно.
Вопросы:
- Why doesn't the linker see those classes despite the Project Reference?
- How to see what the linker actually "sees"? (at least, which files)
- Следовательно: как скормить классы компоновщику?
Если я явно добавлю путь к этим .obj
, все правильно компилируется и компонуется. Но это очень запутанный путь, и я хочу дать тем, кто будет этим заниматься, относительно простые инструкции.
Я буду признателен за любую помощь.