Как обеспечить согласованную среду сборки на компьютерах для C ++ в Visual Studio 2015? - PullRequest
5 голосов
/ 14 октября 2019

У меня есть некоторый код C ++ в Visual Studio 2015, который компилируется и отлично работает на моей машине, но не на моем партнере по команде.

У нас точно такая же база кода и точно такие же версии всехте же библиотеки, но на его компьютере Visual Studio не может правильно разрешить некоторые макросы шаблонов, в то время как мой работает нормально.

Я пытаюсь воссоздать его среду сборки, чтобы воспроизвести проблему. Мы оба используем Visual Studio 15, обновление 3, версия 14.0.25431.01, но версии Visual C ++ 2015 отличаются, но я не могу найти способ указать версию, которую я хотел бы использовать в Visual Studio.

Как мне это сделать? И вообще, как я могу гарантировать, что наши среды сборки совместимы в Visual Studio?


РЕДАКТИРОВАТЬ: Чтобы получить дополнительную информацию из комментариев о том, что мы сделали до сих пор:

  • Мы оба используем одну и ту же версию Visual Studio 2015 (обновление 3, версия 14.0.25431.01)
  • Обеспечение того, чтобы наши библиотеки относились к каталогу решений и загружались вместе с репозиторием проекта, поэтомунет неправильных путей
  • Включены файлы репозитория и решения в репозиторий и гарантировано, что они имеют одинаковую
    • версию целевой платформы (версия Windows SDK): Windows 8.1
    • Набор инструментов платформы: Visual Studio 2015 (v140)

РЕДАКТИРОВАТЬ: Как упоминалось @Marek R, я должен включить точную ошибку, которую я имел: я пытаюсь сделать некоторыеобработка сигналов с помощью библиотеки Eigen.

Точная строка, на которой происходит сбой, пытается инициализировать массив следующим образом:

Eigen::ArrayX<int> foo(size_of_the_array), затем использовать этот массив следующим образом:

foo(index) = bar

Eigen использует макрос над шаблоном, используя операторы, чтобы переопределить этот тип следующим образом: Eigen::Array<int,-1,1>

Это работает, как и ожидалось, на моем компьютере, но при попытке скомпилировать его, он не работает

3>HighRes.cpp(187): error C2514: 'Eigen::Array<int,-1,1,,-1,1>': class has no constructors
3>  c:\WORKING_DIR\sigproc_vs2015\eigen\eigen\src/Core/Array.h(46): note: see declaration of 'Eigen::Array<int,-1,1,,-1,1>' 3>HighRes.cpp(188): error C2039: 'size': is not a member of 'Eigen::Array<int,-1,1,,-1,1>'

3>  c:\WORKING_DIR\sigproc_vs2015\eigen\eigen\src/Core/Array.h(46): note: see declaration of 'Eigen::Array<int,-1,1,,-1,1>' 3>HighRes.cpp(188): error C2039: '__this': is not a member of 'Eigen::Array<int,-1,1,,-1,1>'

3>  c:\WORKING_DIR\sigproc_vs2015\eigen\eigen\src/Core/Array.h(46): note: see declaration of 'Eigen::Array<int,-1,1,,-1,1>' 3>HighRes.cpp(189): error C2064: term does not evaluate to a function taking 1 arguments

Что еще более странно, так это то, что другие разделы кода имеют похожие вызовы к этому макросу, но с другими типами, например: Eigen::ArrayX<bool> baz(some_other_size);, и его сборка на это не жалуется. Я пытаюсь воспроизвести это поведение на своем.


ОБНОВЛЕНИЕ: У меня был шанс поиграть с его машиной немного больше, и я заметил пару вещей:

1: Его машина прекрасно работает Eigen::ArrayX<T> где-нибудь еще, кроме определенного раздела кода, который не удалось построить ранее

2: Единственное, что особенного в этом конкретном разделе, это то, что он находится внутри замыкания

auto process_in_parallel = [state](int dimension){ 
    // Other code...
    Eigen::ArrayX<int> foo(size_of_the_array);

3: Eigen использует вложенные макросы для определения шаблона, используя операторы, которые определяют класс ArrayX.

У меня действительно было много проблем с получением Visual Studio 15 для работы с шаблоном, используяоператоры и вложенные шаблоны классов;компилятор часто зависал и просто просил меня упростить мой код вокруг заданной строки. Я рад обойти это, изменив определение на Eigen::ArrayXi;псевдоним не шаблонного типа. Это прекрасно компилируется, и сборка проходит все тесты.

Ответы [ 2 ]

0 голосов
/ 14 октября 2019

версии Visual C ++ 2015 отличаются

Самый простой способ исправить это - обновить Visual Studio до последней версии для вас обоих. Он также обновит все установленные компоненты, включая набор инструментов C ++.

Еще одна вещь, которая может отличаться, это компоненты установленного Windows SDK и набор системных библиотек. Убедитесь, что вы используете те же версии Windows (используйте команду winver). Сообщение об ошибке поможет диагностировать проблему.

0 голосов
/ 14 октября 2019

Вам нужно будет синхронизировать проекты и решения на разных ПК, а также кодовую базу.

Если вы сделаете это, то сможете явно выбрать, какие инструменты сборки использовать для любого проекта в свойствах этого проекта:

Свойства конфигурации -> Общие -> Набор инструментов платформы

Убедитесь, что один и тот же выбран на разных компьютерах (это должен быть набор инструментов, который используется на обоих компьютерах). установили).

РЕДАКТИРОВАТЬ: Вероятно, вы также должны убедиться, что выбранная «версия Windows SDK» одинакова для всех проектов на двух ПК. Это может не оценить то же самое, если выбрана «последняя версия». (И вам также может понадобиться установить SDK, который «работает» для вас, на ПК вашего коллеги.)

...