cmake: обрабатывать сторонние зависимости (включая / lib) для разных компиляторов / платформ - PullRequest
0 голосов
/ 03 сентября 2018

Мне нужно создать код C ++ для нескольких платформ (Windows и Linux), 32- и 64-разрядных и нескольких компиляторов (Visual Studio 2010 и Visual Studio 2017).

Я использую несколько сторонних разработчиков, таких как: Boost, Tbb, Xerces и др.

Как мне нужно учитывать тот факт, что для Visual Studio 2010, Visual Studio 2017, 32/64 бит и т. Д. Мне нужно использовать разные версии сторонних включений и библиотек?

Нужно ли иметь что-то вроде операторов if в файлах CMakeLists.txt, где я указываю разные пути включения / библиотеки и разные имена библиотечных файлов для разных условий?

1 Ответ

0 голосов
/ 03 сентября 2018

Как мне нужно учитывать тот факт, что для Visual Studio 2010, Visual Studio 2017, 32/64 бит и т. Д. Мне нужно использовать разные версии сторонних включений и библиотек?

На самом деле, вам не нужно делать ничего особенного, чтобы "обработать этот факт"%) Например, вы можете загрузить Официальные предварительно созданные двоичные файлы Boost (например, пакет all-in-one) и установить его, скажем, по умолчанию, путь C:\local\boost. В зависимости от выбранного набора инструментов / VS-версия find_package(boost ...) будет искать соответствующие библиотеки без дополнительных усилий с вашей стороны. Вы просто используете найденные библиотеки без if с.

То же самое для Linux. Скажем, вам нужна Ubuntu 18.04 amd64 и CentOS 7 x86. Просто установите пакет надстройки, если он поставляется с дистрибутивом, или создайте его самостоятельно, если это не так. Тогда "используй" это%)

Нужно ли иметь что-то вроде операторов if в файлах CMakeLists.txt, где я указываю разные пути include / library и разные имена библиотечных файлов для разных условий?

Звучит как непонимание того, как работает CMake%). В CMakeLists.txt вашего проекта вы описываете только одну (хорошо, несколько, для генераторов с множеством конфигураций) сборку. Чтобы это произошло, у вас CMakeLists.txt есть find_package для необходимых третьих сторон, и они найдут ровно одну версию любой зависимости (хорошо, я сейчас говорю о обычных проектах). Затем, используя разные ОС / среды, вы можете создавать необходимые артефакты.

Итак, вам просто не нужны «разные» пути включения / библиотеки. С точки зрения вашего проекта, вы просто используете find_package (для повышения и т. Д.), А затем используете его результаты (импортированные цели любого типа). Потому что обычно сборка происходит внутри подготовленной среды, такой как докер или бродячий образ со всеми необходимыми предварительными условиями, и вы просто не можете произвести все необходимые сборки, используя единственную ОС / среду, поэтому вам не нужно устанавливать разные версии ...

... если быть точным, вы можете ... теоретически ... но настроить кросс-компиляцию намного сложнее, чем запекать образ докера / бродяги целевой ОС).

Так что для вашего случая вам нужно собрать одни и те же источники несколько раз:

  • для Windows и других VisualStudio (2 версии * 2 архитектуры);
  • для всех дистрибутивов и архитектур Linux (N-distros * 2 архитектуры).
...