Ссылка на файлы .obj другого проекта для GoogleTest с использованием ссылок на проекты

Проблема специфична для VS2010. Я не мог воспроизвести это в простом случае, чтобы дать MCVE (см. ниже).

Есть какой-то старый, унаследованный проект. Он имеет (среди прочего) 3 проекта C++:

  1. GoogleTestingFramework – проект .lib, в котором реализованы функции GTest и GMock. Создан для простоты использования.

  2. OldLegacyProject – старый проект .exe.

    • The entities on interest here are Class1 and Class2. Both are in separate files, Class1.cpp+Class1.hpp (the same for Class2).
  3. OldLegacyProjectUnitTests – новый проект .exe с модульными тестами, написанными с использованием GTest и GMock.

    • This project is referencing GoogleTestingFramework and OldLegacyProject 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:
      enter image description here
      • I tried to change Use Library Dependency Inputs to true, but it didn't change anything regarding the problem
    • классы из этого проекта используют Class1 и Class2 напрямую (поскольку они являются для них модульными тестами) и должны быть связаны с их .obj

Когда я пытаюсь собрать все, я получаю следующие ошибки лайкера:

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, все правильно компилируется и компонуется. Но это очень запутанный путь, и я хочу дать тем, кто будет этим заниматься, относительно простые инструкции.

Я буду признателен за любую помощь.


person Sokeks    schedule 10.10.2015    source источник
comment
Голосование за повторное открытие: stackoverflow.com/questions/25611998/ является лучшим кандидатом для дублирования маркировки, поскольку она показывает, как ссылаться на библиотеки в VS.   -  person ivan_pozdeev    schedule 11.10.2015
comment
Я против повторного открытия - это нетривиальное связывание .libs, мой вопрос в другом. Мой старый устаревший проект и .exe один. Использование ссылок вместо изменения параметров компоновщика было очень полезно для меня при работе с файлами .obj (НЕ .lib), которые являются промежуточными при создании .exe... и в этом проблема, почему это не работает!   -  person Sokeks    schedule 12.10.2015
comment
Вы не должны связывать проект с отдельными файлами .obj из другого проекта. Рефакторинг общего кода в статическую библиотеку. Этот грязный хак, возможно, сработал по какой-то причине, но это определенно не поддерживаемый способ сделать это.   -  person ivan_pozdeev    schedule 12.10.2015
comment
Почему это сработало, я предполагаю, что раньше при ссылке на проект добавлялись все его объектные файлы в путь ссылки реферера, но теперь он добавляет к нему только свои окончательные артефакты. Причина, вероятно, заключалась в том, чтобы исправить неправильное связывание в случае конфликта имен.   -  person ivan_pozdeev    schedule 12.10.2015
comment
Я не могу провести рефакторинг — как я уже сказал, это старый и устаревший код, и никто не хочет вносить больше изменений, чем это абсолютно необходимо. И почему я не должен использовать файлы .obj? Любая причина для этого? Я использую один и тот же компилятор, он компилирует один за другим, так что это не должно быть проблемой. Кроме того, это одно из предлагаемых решений, например. посмотрите здесь: Использование .obj. Единственное отличие заключается в использовании ссылок, что, похоже, у меня не работает :(   -  person Sokeks    schedule 12.10.2015
comment
И последняя фраза в ссылке: Поддержание правильной связи UnitTest может стать рутиной, и вы можете прийти к выводу, что сержант-инструктор был прав в конце концов. Хорошо, давайте отметим этот вопрос. как дубликат того, мне все равно, пока я могу искренне назвать это дело раскрытым.   -  person ivan_pozdeev    schedule 12.10.2015
comment
В связи с этим я все же рекомендую библиотеку, так как она сэкономит вашу работу в долгосрочной перспективе.   -  person ivan_pozdeev    schedule 12.10.2015
comment
@ivan_pozdeev Человек... при всем уважении, но вы не получаете то, о чем я прошу... Я знаю возможную ситуацию, обходные пути и т.д., но из-за некоторых других условий я ищу просто возможное решение для моего случая . КАЖЕТСЯ, что он использует Visual Studio REFERENCES из Framework and References, но это не работает для моей конкретной ситуации. Я не знаю, почему это не работает, и ищу помощи, как решить или отладить поведение компоновщика. Почему вы так напрягаетесь, чтобы закрыть этот вопрос?   -  person Sokeks    schedule 12.10.2015
comment
...Иначе нужно заниматься танцами с бубном, чтобы добавить на вход компоновщика якобы залинкованные вами файлы. Референция этого не сделала, поэтому нам теперь нужно выяснить, что именно она делает и, следовательно, что еще нам нужно настроить. Покажите или изучите 1) Командную строку компоновщика 2) Каталог, в котором находятся ваши предположительно связанные классы (.obj) 3) Журнал сборки, чтобы увидеть, скопировано ли что-то из OldLegacyProject куда-то в результате ссылки.   -  person ivan_pozdeev    schedule 12.10.2015
comment
Кроме того, если я явно добавлю путь к этим объектам, все скомпилируется и линкуется корректно. - разве это не самое простое решение? Это именно то, что нам нужно сделать. Вопросы в пред. comment предназначены для того, чтобы сделать это более VS-образным способом, но если вам все равно...   -  person ivan_pozdeev    schedule 12.10.2015
comment
@ivan_pozdeev Нет, ссылка может работать, и у меня есть рабочее решение, показывающее, что оно работает (я писал об этом), но должен быть какой-то крайний случай, в другом случае он не работает. И 1) я изучил и не могу найти никакой разницы между моим рабочим и нерабочим решением 2) журнал сборки, это хорошее направление, пробовал, но не могу найти никаких советов, что должно или не должно быть там.   -  person Sokeks    schedule 12.10.2015
comment
Давайте продолжим обсуждение в чате.   -  person ivan_pozdeev    schedule 12.10.2015
comment
@ivan_pozdeev разве это не самое простое решение? - нет, я хотел бы дать другим пользователям простое руководство, чтобы повторить мои шаги, например, добавить ссылку, и все будет работать из коробки, добавление явно каждого .obj не так просто и быстро.   -  person Sokeks    schedule 12.10.2015
comment
@ivan_pozdeev Извините, я не могу сейчас зайти в чат - фильтры компании блокируют чаты :(   -  person Sokeks    schedule 12.10.2015
comment
Попробуйте HTTPS обойти. По основному вопросу: самый простой способ - искать различия в журналах сборки, в частности, в командных строках компоновщика и строках, связанных с рассматриваемыми файлами/каталогами.   -  person ivan_pozdeev    schedule 12.10.2015
comment
Решение: Ссылка НЕ ​​включает файлы .obj. Простой пример, который у меня был, заключался в использовании файлов заголовков с функциями шаблона, которые встроены из .hpp, поэтому он ничего не доказал. Пришлось искать общее решение.   -  person Sokeks    schedule 12.10.2015