Использование CMake для создания файлов проекта Visual Studio C ++


93

Я работаю над проектом C ++ с открытым исходным кодом для кода, который компилируется в Linux и Windows. Я использую CMake для сборки кода в Linux. Для простоты настройки разработки и по политическим причинам я должен придерживаться файлов / редактора проекта Visual Studio в Windows (например, я не могу переключиться на Code :: Blocks ). Я вижу инструкции по созданию файлов Visual Studio с помощью CMake, как здесь .

Вы раньше использовали CMake для создания файлов Visual Studio? Каким был твой опыт? Предположим, я хочу добавить в свой проект новый файл. Что для этого нужно?


1
Для тех, кто в GNU + Linux пытается сгенерировать файлы проекта для Visual Studio, специфичного для Windows, помните об этом ответе . TL; DR: генераторы зависят от платформы, и для этого вы должны быть в Windows.
code_dredd 03

Ответы:


57

CMake на самом деле очень хорош для этого. Ключевым моментом было то, что все на стороне Windows должны помнить о запуске CMake перед загрузкой в ​​решение, а все на нашей стороне Mac должны не забыть запускать его перед make.

Самым сложным было для разработчика Windows убедиться, что ваши структурные изменения были в файле cmakelist.txt, а не в файлах решения или проекта, поскольку эти изменения, вероятно, будут потеряны, и даже если они не будут потеряны, они не будут переданы на сторону Mac, которая они также были необходимы, и разработчикам Mac нужно было помнить, что не следует изменять make-файл по тем же причинам.

Это просто требует немного размышлений и терпения, но сначала будут ошибки. Но если вы используете непрерывную интеграцию с обеих сторон, они рано или поздно выйдут из строя, и люди со временем привыкнут.


11
Если это когда-то было правдой, то больше нет. Любые изменения в CMakeLists.txt вызовут регенерацию системы сборки (файлы проекта для Visual Studio, файлы сборки и т. Д.). Рабочий процесс в Visual Studio немного раздражает, поскольку Visual Studio не регенерирует файлы проекта, когда обнаруживает, что что-то изменилось, а вместо этого ждет, пока вы выполните сборку, которая вызывает диалоговое окно, поскольку сборка должна быть прервана для повторного -загрузить файл проекта.
Виталий

1
Предостережение заключается в том, что вам не нужно запускать компилятор Visual Studio через IDE. Вы можете запустить его из командной строки:C:\...> MSBuild ALL_BUILD.vcxproj
PfunnyGuy

2
@PfunnyGuy См. Также cmake --build ..
Detly

@detly Спасибо! Я действительно это нашел и использую cmake --build . --config Debug -- /nologo /verbosity:minimal /m. Я . target run_testsвставлю после, чтобы запустить мой модульный тест googletest, а «Отладка» можно заменить на «Выпуск». (Добавление параметра конфигурации для отладки не является обязательным, поскольку оно используется по умолчанию, но я включил его, чтобы показать, как его можно заменить с помощью «Release»)
PfunnyGuy

48

Не уверен, что это напрямую связано с вопросом, но я искал ответ о том, как сгенерировать * .sln из проектов cmake. Я обнаружил, что можно использовать что-то вроде этого:

cmake -G "Visual Studio 10"

В примере создаются необходимые файлы VS 2010 из входного файла CMakeLists.txt.


1
На stackoverflow.com/questions/11269833/… @Ivan указывает, что это можно поместить в файл PreLoad.cmake в той же папке, что и ваш CMakeLists.txt верхнего уровня, и тогда вы можете просто сделать cmake.
PfunnyGuy

25

Мы переместили цепочку сборки нашего отдела на CMake, и у нас возникло несколько внутренних препятствий, поскольку другие отделы использовали наши файлы проектов и привыкли просто импортировать их в свои решения. У нас также были некоторые жалобы на то, что CMake не полностью интегрирован в диспетчер проектов / решений Visual Studio, поэтому файлы приходилось добавлять вручную в CMakeLists.txt; это был серьезный прорыв в рабочем процессе, к которому люди привыкли.

Но в целом это был довольно плавный переход. Мы очень счастливы, так как нам больше не нужно иметь дело с файлами проекта.

Конкретный рабочий процесс добавления нового файла в проект очень прост:

  1. Создайте файл, убедитесь, что он находится в нужном месте.
  2. Добавьте файл в CMakeLists.txt.
  3. Сборка.

CMake 2.6 автоматически перезапускается, если какие-либо файлы CMakeLists.txt изменились (и (частично) автоматически перезагружает решение / проекты).

Помните, что если вы выполняете сборки вне исходного кода, вам нужно быть осторожным, чтобы не создать исходный файл в каталоге сборки (поскольку Visual Studio знает только о каталоге сборки).


9

Как говорит Алекс, работает очень хорошо. Единственная сложная часть - не забывать вносить любые изменения в файлы cmake, а не из Visual Studio. Таким образом, на всех платформах рабочий процесс аналогичен тому, как если бы вы использовали простые старые make-файлы.

Но с ним довольно легко работать, и у меня не было проблем с тем, что cmake генерирует недопустимые файлы или что-то в этом роде, поэтому я не слишком беспокоюсь.


9

CMake без проблем создает проекты и решения Visual Studio. Вы даже можете создавать проекты / решения для разных версий Visual Studio, не внося никаких изменений в файлы CMake.

Добавление и удаление исходных файлов - это всего лишь вопрос изменения CMakeLists.txtсписка исходных файлов и восстановления проектов / решений. Есть даже функция подстановки для поиска всех источников в каталоге (хотя ее следует использовать с осторожностью).

Следующая ссылка очень хорошо объясняет поведение CMake и Visual Studio.

CMake и Visual Studio


Эта ссылка и ее образец проекта очень и очень полезны, спасибо за это! Я бы порекомендовал включить в ваш ответ часть исходного кода из репозитория github , например, упомянув, что проект CMake является эквивалентом решения, и что что-то вроде add_executable используется для добавления эквивалента проекта Visual Studio.
младший

5

CMake может генерировать действительно хороший Visual Studio .projs/ .slns, но всегда есть проблема с необходимостью изменения .cmakeфайлов, а не с .proj/ .sln. В настоящее время мы работаем с этим следующим образом:

  1. Все исходные файлы отправляются, /srcа файлы, видимые в Visual Studio, являются просто «ссылками» на них, определенными в .filter.
  2. Программист добавляет / удаляет файлы, не забывая работать в определенном /srcкаталоге, а не в каталоге проекта по умолчанию.
  3. Закончив, он запускает сценарий, который «обновляет» соответствующие .cmakeфайлы.
  4. Он проверяет, можно ли построить код в воссозданной среде.
  5. Он фиксирует код.

Сначала мы немного боялись того, чем все закончится, но рабочий процесс работает очень хорошо, и с хорошим различием, видимым перед каждой фиксацией, каждый может легко увидеть, правильно ли его изменения были отображены в .cmakeфайлах.

Еще одна важная вещь, о которой следует знать, - это отсутствие поддержки ( afaik ) для «Конфигураций решения» в CMake. В его нынешнем виде вам необходимо создать два каталога с проектами / решениями - по одному для каждого типа сборки (отладка, выпуск и т. Д.). Нет прямой поддержки более сложных функций - другими словами: переключение между конфигурациями не даст вам того, чего вы могли ожидать.


4
Начиная с CMake 2.8.10, сгенерированные решения имеют 4 стандартные конфигурации сборки, и есть поддержка для определения дополнительных настраиваемых.
Джон


0

Я начал свой собственный проект под названием syncProj. Документация / ссылки для скачивания отсюда:

https://docs.google.com/document/d/1C1YrbFUVpTBXajbtrC62aXru2om6dy5rClyknBj5zHU/edit# https://sourceforge.net/projects/syncproj/

Если вы планируете использовать Visual Studio для разработки, и в настоящее время поддерживается только C ++.

Основное преимущество по сравнению с другими системами make заключается в том, что вы действительно можете отлаживать свой сценарий, поскольку он основан на C #.

Если вы не знакомы с syncProj, вы можете просто преобразовать свое решение / проект в сценарий .cs и продолжить дальнейшую разработку с этого момента.

В cmake нужно будет писать все с нуля.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.