Ответы пользователя по тегу CMake
  • Кириллица в c++. Что с ней не так?

    @res2001
    Developer, ex-admin
    В виндовой консоли есть 2 русские кодировки cp866 и cp1251. Причем cp866 используется по умолчанию! Так же есть еще 65001 (UTF8), которая то же умеет в кирилицу. Пользователь консоли может менять кодировку по собственному усмотрению (команда chcp /?). Как правило встроенные виндовые утилиты командной строки правильно работают с любой установленной кодировкой (можете сами в этом убедиться).

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

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

    Лучше исходники всегда писать в UTF8 а для строк использовать wchar_t.
    Тут и не только тут эта проблема уже обсуждалась не однократно. Например посмотрите эту ссылку: https://qna.habr.com/answer?answer_id=2278154#comm...
    Не смотрите, что там тема по Си - проблема та же самая и решения для Си и С++ будут похожие.
    Ответ написан
    Комментировать
  • Как компилировать общие файлы двух бинарников один раз?

    @res2001
    Developer, ex-admin
    Из файлов исходников, которые используются (или теоретически могут использоваться) в разных целях делаешь статическую библиотеку в рамках этого же проекта.
    В зависимости от размера проекта таких промежуточных библиотек может быть много. Есть смысл сами подобные библиотеки разделять по функционалу. Например в одном тесте тестируется какой-то определенный функционал, в другом - другой функционал и т.п.
    Дальше эту библиотеку(и) ставишь в зависимости для конкретных целей (исполняемый файл, тесты и т.п.)
    Ответ написан
    Комментировать
  • Сmake не подключаеться библиотека curses,что делать?

    @res2001
    Developer, ex-admin
    Ошибка у вас не про библиотеку, а про
    add_executable(ctest ${SOURCES})
    Переменная SOURCES не определена там где она используется. Поэтому ctest получается без исходников - собирать нечего.

    Вообще обычно подключаю библиотеки через find_package или pkg_check_modules, но для этого надо использовать какую-то среду с пакетным менеджером и возможно поддержкой pkgconfig. Под виндой можно использовать msys2+mingw например - там все это есть. Или vcpkg для MSVS (или что там сейчас актуальное, не отслеживаю).
    Ваш вариант подключения то же должен работать, но надо еще указать путь к заголовочным файлам, чтоб было совсем красиво. Подобный способ не переносим, стоит поискать альтернативу.
    Ответ написан
    5 комментариев
  • Как настроить CMake в Clion для stm32 для подключения библиотек?

    @res2001
    Developer, ex-admin
    Попробуйте в include_directories() указывать полные пути. Стандартная переменная cmake ${CMAKE_CURRENT_SOURCE_DIR} содержит путь где лежит текущий файл cmakelists.txt, ее можно использовать для генерации полного пути.
    Обычно, если в проекте используется иерархия каталогов, то в каждом каталоге с исходниками лежит свой собственный cmakelists, а подключается он к нижележащему через add_subdirectory(). Собирайте в каждом каталоге свою цель (статическую библиотеку), потом эти цели указывайте в зависимостях для основной цели.
    Ответ написан
    Комментировать
  • Следую туториалу по тому как использовать vcpkg в проектах CMake, но выдается ошибка, может я что-то не сделала?

    @res2001
    Developer, ex-admin
    Судя по ошибке, cmake пытается использовать генератор "NMake Makefiles". nmake - это такой куцый вариант make от микрософт, идет в составе MSVS. Но MSVS у вас, похоже, не установлен, вот cmake и не может его найти.
    Обычно генератор задается опцией -G при вызове cmake.
    Список поддерживаемых генераторов смотрите: cmake --help
    Но это не значит, что все они будут работать в вашей конфигурации, т.к. все они требуют дополнительного ПО.

    Под виндой, обычно ставят MSVS или Build Tools и выбирают соответствующий генератор в cmake (или возможно cmake находит сам подходящий генератор).
    Альтернативные варианты:
    msys2+mingw - генератор MSYS Makefiles или MinGW Makefiles
    msys2+mingw+ninja - генератор Ninja
    mingw можно заменить на clang.

    Смысл в том, что VS Code - это грубо говоря текстовый редактор адаптированный для написания программ.
    cmake - это система сборки.
    Но ничего из этого самостоятельно компилировать программы не умеет - они используют какой-то компилятор, который надо установить в систему. Какой именно - выбирать вам.
    MSVS, в отличие от VS Code, это IDE со встроенным компилятором - и там уже полный фарш, думать как собрать программу не надо.
    Но разобраться в этой кухне стоит, раз уж вы изучаете С/С++.
    Ответ написан
    2 комментария
  • Как правильно подключать модули одного уровня?

    @res2001
    Developer, ex-admin
    Модуль B использует данные из Модуля A

    Что за данные?

    смаке оперирует целями и зависимостями, а не данными.
    Зависимости можно указать с помощью add_dependencies, подключить библиотеку с помощью target_link_libraries.
    Если у вас в каком-то из модулей генерируются какие-то данные, то, видимо, там есть custom_target - укажите его в зависимостях вышележащего уровня.
    Ответ написан
    9 комментариев
  • Как написать правильно приложение на с++?

    @res2001
    Developer, ex-admin
    Что бы при переносе вашей программы на другой комп не терялись зависимости (библиотеки), нужно эти зависимости передавать вместе с программой явно - передавать необходимые dll файлы. Обычно для этого делают установочный пакет, куда входит все необходимое плюс скрипт установки, если требуются какие-то дополнительные действия, кроме копирования файлов.
    Другой вариант - использовать статическую компиляцию с библиотеками, тогда библиотека будет входить в состав вашего исполняемого файла. Размер исполняемого файла при этом будет заметно больше.

    В линуксе для динамических библиотек используется каталог (/lib; /usr/lib) отличный от каталога с исполняемыми файлами (/bin, /usr/bin), поэтому появляется возможность устанавливать библиотеки через пакеты пакетного менеджера универсально для всех программ, использующих данную библиотеку. В пакете программы просто указывается зависимости от пакетов используемых библиотек.
    В винде принято все зависимости программы устанавливать в каталог с исполняемым файлом программы. И тут нет какого-то общепринятого механизма делать как линуксе. Хотя никто не запрещает вам делать свой собственный софт с подобным механизмом, но сам механизм вы должны придумать и поддерживать самостоятельно в своем софте и кроме ваших программ никто больше использовать этот механизм не будет.

    В cmake есть еще вариант поиска пакетов с помощью pkg-config: https://cmake.org/cmake/help/latest/module/FindPkg...
    Ответ написан
    Комментировать
  • Как изменить имя выходного файла через CMakeLists.txt?

    @res2001
    Developer, ex-admin
    На счет имени таргета посмотрите тут: https://stackoverflow.com/questions/31038963/how-d...
    С каталогом, ну я бы в проекте сделал подкаталог MyDir и в нем свой cmakelists.txt с описанием таргета для библиотеки. Библиотека будет собираться в своем подкаталоге. В корневой cmakelists.txt включать подкаталог с помощью add_subdirectory(MyDir)
    Ответ написан
    1 комментарий
  • Превратить команду gcc в cmake?

    @res2001
    Developer, ex-admin
    Нельзя превратить эту команду в команду cmake.
    Вам нужно написать файл cmakelists.txt, который положить в папку с проектом. Там описать проект, цели, подключаемые библиотеки, опции компилятор и т.п.

    Сборка с помощью cmake происходит типовыми командами практически одинаковыми для любого cmake проекта. Находясь в каталоге сборки (любой пустой каталог):
    cmake <каталог с проектом> -G <generator type>
    cmake --build .

    generator type - зависит от того с помощью чего вы планируете осуществлять сборку. Обычно в линукс это "Unix Makefiles" в винде например "Visual Studio 15 2017". Весь список поддерживаемых генераторов можно увидеть с помощью cmake --help
    Ответ написан
    Комментировать
  • Как в cmake слинковать статично одну библиотеку?

    @res2001
    Developer, ex-admin
    Я обычно библиотеки подключаю, используя pkg_check_modules.
    Эта функция ищет и динамические и статические библиотеки, используя pkg-config.
    Для статических библиотек возвращается свой набор переменных с префиксом <PREFIX>_STATIC. Для подключения статической библиотеки используйте эти переменные.
    Ответ написан
    Комментировать
  • Ошибки этой быть не должно, почему возникает?

    @res2001
    Developer, ex-admin
    Нужно добавить в INCLUDES опцию -I с путем к папке, где содержится Machinarium/Filesystem/Utils.hpp
    Ответ написан
  • Какая область видимости "глобальных сущностей" CMake?

    @res2001
    Developer, ex-admin
    Вот тут пишут: https://cmake.org/cmake/help/v3.10/command/link_li...
    что это повлияет только на цели созданные в текущем или ниже CMakeLists.
    Подозреваю, что в link_libraries просто меняется переменная. А переменные в cmake ведут себя по умолчанию так как описано, т.е. изменения видны тут и ниже. Чтоб они были видны выше, нужны танцы с бубном, чего, видимо, нет в link_libraries

    При этом цели созданные во вложенных CMakeLists прекрасно видны во всех других CMakeLists, не обязательно ниже по иерархии, но и в другой ветке то же.
    Ответ написан
    Комментировать
  • Как исправить ошибку PermissionDenied, try_compile?

    @res2001
    Developer, ex-admin
    Похоже cmake не может найти компилятор. Возможно надо в переменную окружения PATH добавить путь до исполняемых файлов mingw и возможно еще создать переменную окружения MINGW_HOME. Тогда cmake должен нормально найти компилятор.

    Лично я не использую mingw и cmake в чистом виде. Использую msys2 с установленным туда с помощью штатного пакетного менеджера и mingw и cmake. В этом случае они отлично дружат.
    Никаких проблем со сборкой именно из-за cmake не было. Можно использовать и из командной строки msys2, можно и из cmd, если добавить пути в PATH и настроить переменные окружения MSYS_HOME и MINGW_HOME.
    Ответ написан
    1 комментарий
  • Что в CMAKE я должен считать библиотекой?

    @res2001
    Developer, ex-admin
    Вообще обычно бибилотеки ставятся отдельно в систему (для линукс) с помощью стандартного пакетного менеджера.

    Если вашей библиотеки в пакетном менеджере нет, то можно и собирать из исходников.
    В этом случае можно и просто "сувать" все файлы в add_executable. Никто ж вам это запретить не может.
    Но обычно проще, лучше и универсальней для сторонних библиотек создавать свои собственные цели с помощью add_library и уже их подключать к основной цели с помощью target_link_libraries. Библиотеку можно делать как динамическую, так и статическую.
    Если проект достаточно развесистый и содержит например тесты и/или несколько исполняемых файлов, то вообще можно в каждом каталоге проекта создавать отдельную статическую библиотеку. На больших проектах это часто может сэкономить время на компиляции, за счет того что в несколько конечных целей будут линковаться уже готовые библиотеки, а не пересобираться из исходников каждый раз.
    Ответ написан
    3 комментария
  • Как добавить библиотеку в qt creator?

    @res2001
    Developer, ex-admin
    Что в пакетах библиотеки нет? Я бы установил библиотеку из пакетов. Обычно для использования библиотеки в своей программе вам требуется так же и ее dev пакет.

    Обычно приличные библиотеки ставят в своем dev пакете и средства для поиска/использования себя. В линуксе это обычно конфигурационный файл для pkg-config. В cmake использовать pkg-config можно с помощью одноименного модуля.
    Если библиотека поддерживает cmake, то она ставит поисковые скрипты для find_package.
    Ответ написан
    2 комментария
  • Как правильно построить структуру проекта используя cmake?

    @res2001
    Developer, ex-admin
    Отлаживать библиотеку логичнее специально написанными для этого тестами. В этом случае библиотека будет представлять самостоятельный продукт. Ее можно будет устанавливать клиентам отдельно. А в основном продукте использовать find_package для поиска библиотеки.

    Если вам этого не надо, то вполне нормально включать каталог с исходниками библиотеки как подкаталог продукта и использовать add_subdirectory.
    Ответ написан
    Комментировать
  • Как настроить ninja под windows?

    @res2001
    Developer, ex-admin
    При установке MSVS устанавливаются вместе с ним несколько батников, которые настраивают среду для сборки.
    У меня в MSVS 2017 они называются "Native tools command promtp ...". В других версиях MSVS название может немного меняться. Батники находятся в меню Пуск в папке MSVS.
    Запустите подходящий батник, он настроит среду сборки и запустит командную строку. Там и выполняйте сборку вашего проекта. При этом никаких ручных настроек не требуется.

    PS: зря вы установили MSVS не в каталог по умолчанию - могут быть трудно диагностируемые проблемы при сборке из командной строки. Возможно вы как раз с этим и столкнулись.
    Ответ написан
    Комментировать
  • Как правильно использовать свои опции в cmake?

    @res2001
    Developer, ex-admin
    1. Первый параметр при запуске cmake - путь к файлу CMakeLists.txt, который нужно обработать.
    Обычно процесс сборки с помощью cmake у меня выглядит примерно так:
    Создаю в произвольном месте пустой каталог для сборки проекта, перехожу в него, там выполняю: cmake <путь к cmakelists.txt>
    В этом случае каталог с исходниками не заполняется не нужными там артефактами сборки.

    2. опции в cmake передаются так cmake ... -D<имя опции>[=значение]
    Т.е. -D - это ключ за которым следует имя опции. Теперь сравните с тем как вы это применяете.
    Синтаксис похож на определение макросов в командной строке компиляторов C/C++.
    Ответ написан
  • Как не собирать повторно зависимость при сборке проекта в cmake?

    @res2001
    Developer, ex-admin
    Ответ в комментариях тут.
    Ответ написан
    Комментировать
  • Как добавить файл конфигурации к библиотеке?

    @res2001
    Developer, ex-admin
    Обычно подобные вещи делаются не так.
    Для этого в cmake предусмотрена функция configure_file
    Смысл в том, что вы создаете шаблонный файл, содержащий ссылки на переменные cmake. configure_file обрабатывает этот шаблон, заменяет все ссылки значениями переменных и создает из них новый файл. Этот новый файл вы и используете в проекте. Т.е. реального файла (в вашем случае conf.h) в проекте не существует, он появляется только во время компиляции.
    Изменять значения переменных cmake пользователь может через параметры командной строки cmake с помощью ключа -D, например: cmake ... -DMY_VAL="New value".
    Подобную переменную внутри cmakelists.txt обычно декларируют через option, там же можно указать и описание переменной и значение по умолчанию.
    Примеры использования можете найти в любом более менее крупном проекте cmake на github.
    Ответ написан
    Комментировать