Ответы пользователя по тегу CMake
  • Как исправить ошибку с OpenCV и C++?

    Nipheris
    @Nipheris Куратор тега C++
    set(CMAKE_CXX_STANDARD 17)
    Это нужно ставить ДО создания таргета, т.к. установка этой переменной выставляет дефолт для НОВЫХ таргетов.

    А ещё лучше выставить проперти CXX_STANDARD с помощью set_target_properties.
    Ответ написан
  • Как написать динамическую библиотеку на C++ при помощи CMake в среде QTCreator, которую потом можно будет импортировать в проекты на Python?

    Nipheris
    @Nipheris Куратор тега C++
    Попробуйте использовать pybind11. Если что, эта библиотека есть в ConanCenter. Вот репозиторий-пример для CMake.
    Ответ написан
    Комментировать
  • Какую build system для C++ стоит изучать в 2023?

    Второй вопрос: минусы cmake

    Чёрт ногу сломит. Но что поделаешь, сегодня это считай стандарт.

    Точее сказать - пользоваться можно, и даже с удовольствием, но до сих пор новичкам приходится выискивать туториалы по тому как делать "правильно" и "современно". В официальных доках сложно (если вообще возможно) найти best practices, поэтому появляются такие проекты и учебники, как An Introduction to Modern CMake. Ещё полезно чейнджлоги смотреть, а то ещё два года пройдёт, пока узнаешь о появлении новых команд для работы с публичными хедерами библиотек.

    Можно ещё Meson глянуть, перспективная штука. Тот же Conan активно вкладывается в её поддержку.
    Ответ написан
    Комментировать
  • Ошибка при компиляции файла в cmake, mingw и wxwidgets?

    Попробуйте не использовать кириллические символы в пути к проекту, это может приводить к проблемам. Равно как и пробелы в путях. И того и другого желательно избегать.
    Ответ написан
    Комментировать
  • Как добавить компоненты QT в cmake?

    Вам нужен и target_link_libraries. Одного find_package недостаточно.
    Ответ написан
  • Как заставить CMake искать библиотеку нужной разрядности через find_package?

    Собирал x86 и x64, притом в один каталог не получилось.

    И не надо. Лично я считаю это извратом (несколько конфигураций в одной общей папке), заставляющим выдумывать соглашения об именах и всякие раскладки по подпапкам, которые у всех потом свои, велосипедные.

    Мне нужно каким-то образом выбирать каталог для поиска OpenCVConfig.cmake через find_package(), т.е. добавлять его в CMAKE_PREFIX_PATH видимо.

    Неплохая идея. И почему не получилось?
    Вообще по идее конфиг библиотеки (который OpenCVConfig.cmake) должен проверять разрядность и не давать подключать библиотеку с невалидной разрядностью. По идее тогда и несколько путей можно указать (не уверен, нужно проверить).
    Ответ написан
    7 комментариев
  • Как собрать библиотеку .lib [muParser]?

    Nipheris
    @Nipheris Куратор тега C++
    Почему бы не посмотреть CI скрипты, например для AppVeyor?
    Версия с мастер-бранча :
    version: 1.0.{build}
    os: Visual Studio 2015
    clone_folder: C:\projects\muParser
    test: off
    branches:
      only:
        - master
    environment:
      matrix:
        - CMAKE_PLATFORM: Visual Studio 14 2015
    build_script:
      - cmake -LAH -G "%CMAKE_PLATFORM%" -DCMAKE_INSTALL_PREFIX="%CD:\=/%/install" .
      - cmake --build . --config Release --target install
      - ctest -C Release --output-on-failure

    Мне кажется вызовы cmake в конце (кроме ctest) будут вам полезны. Да, вместо CMAKE_PLATFORM можно указать другой генератор, например MinGW Makefiles.
    Ответ написан
    Комментировать
  • Как включить в статическую библиотеку все зависимости из других стат.библиотек в CMake проекте?

    Nipheris
    @Nipheris Куратор тега C++
    Господи, что ж тут за костыли насоветовали))

    Этого хотелось бы избежать, то есть нужно, чтобы все зависимости от boost были уже включены в mylib.

    Как верно отметил jcmvbkbc , обычно одна стат. библиотека не тащит в себе другую. Более того, такая возможность - включить одну стат. библиотеку в состав другой - мало где существует, я знаю про поддержку такой фичи только в Visual Studio. Ну т.е. это нечто из ряда вон выходящее, а не привычный workflow. По-нормальному вы должны указывать при линковке стат. библиотеки все её зависимости. Следовательно, вопрос в том, как эту информацию о транзитивных зависимостях статической библиотеки передавать и использовать при линковке с ней.

    pkg-config в общем вполне нормальное решение, но это уже не совсем "в рамках CMake".
    В рамках CMake всё делается с помощью target_link_libraries и экспорта симейк-конфига в паре с файлом симейковских таргетов. Например, вот такой незамысловатый скрипт:
    cmake_minimum_required(VERSION 3.5)
    find_package(Boost COMPONENTS system filesystem thread REQUIRED)
    add_library (mylib mysource.cpp)
    target_link_libraries(mylib
    	PRIVATE
    		Boost::system
    		Boost::filesystem
    		Boost::thread
    )
    
    install(TARGETS mylib EXPORT mylib_export)
    export(EXPORT mylib_export FILE cmake/mylib-targets.cmake)

    сгенерирует в поддиректории cmake в директории сборки файл mylib-targets.cmake, где помимо прочего будет следующая любопытная информация:
    # Create imported target mylib
    add_library(mylib STATIC IMPORTED)
    
    set_target_properties(mylib PROPERTIES
      INTERFACE_LINK_LIBRARIES "\$<LINK_ONLY:Boost::system>;\$<LINK_ONLY:Boost::filesystem>;\$<LINK_ONLY:Boost::thread>"
    )


    Таким образом, Симейк сообщает потребителям библиотеки mylib, что при линковке с ней нужно ещё добавить бустовские таргеты. Причём благодаря LINK_ONLY это коснётся только процесса линковки, в целом зависимость от библиотек буста будет приватной, как и указано в скрипте. Если поменять PRIVATE на PUBLIC и сделать тем самым зависимость от буста публичной, то LINK_ONLY уйдёт и будет обычное перечисление интерфейсных зависимостей таргета:
    # Create imported target mylib
    add_library(mylib STATIC IMPORTED)
    
    set_target_properties(mylib PROPERTIES
      INTERFACE_LINK_LIBRARIES "Boost::system;Boost::filesystem;Boost::thread"
    )


    Вам остаётся лишь добавить генерацию и установку тривиального конфига (где будет только find_package для буста и инклуд сгенерированного mylib-targets.cmake) и в потребителях делать find_package(mylib). Всё это кроссплатформенно и является стандартной практикой, не делайте лишних извращений со слиянием статических библиотек.
    Ответ написан
    Комментировать
  • Структура и зависимости кросс-платформерного проекта CMake?

    Nipheris
    @Nipheris Куратор тега C++

    Один из моих вариантов решения проблемы:
    Написать скрипт (скорее всего на python, ибо нужна возможность компилировать как из под Windows, так и из под Linux), который будет собирать все зависимости под конкретную платформу, раскидывать по папочкам и генерировать скрипт с путями ко всем нужным библиотекам.

    Поразительно, но вы в точности описали пакетный менеджер Conan (о котором упоминали).

    Написать скрипт (скорее всего на python, ибо нужна возможность компилировать как из под Windows, так и из под Linux)

    Конан написан на Питоне и распространяется как pip-пакет.

    который будет собирать все зависимости под конкретную платформу, раскидывать по папочкам

    https://docs.conan.io/en/latest/using_packages/con...
    Together, these folders are the local cache. This is where package recipes and binary packages are stored and cached, so they don’t have to be retrieved again.


    и генерировать скрипт с путями ко всем нужным библиотекам

    https://docs.conan.io/en/latest/reference/generato...
    Generators are specific components that provide the information of dependencies calculated by Conan in a suitable format for a build system. They normally provide Conan users with a conanbuildinfo.XXX file that can be included or injected to the specific build system.
    Ответ написан
    Комментировать
  • Как подключить boost.python без ошибок?

    Nipheris
    @Nipheris Куратор тега C++
    Раз у вас свежий CMake и если я правильно понял ваши намерения, давайте попробуем вот такой вариант:
    cmake_minimum_required(VERSION 3.14)
    project(foobaria)
    
    find_package(Python3 REQUIRED COMPONENTS Development)
    find_package(Boost REQUIRED COMPONENTS python)
    
    python3_add_library(main MODULE src/_nonsence.cpp)
    target_link_libraries(main Boost::python) # тут возможно нужно Boost::python3
    Ответ написан
  • Настройка manifest tool через cmake?

    Nipheris
    @Nipheris Куратор тега C++
    Как насчёт слияния кастомного манифеста из вашего проекта и дефолтового?

    CMake learned to honor *.manifest source files with MSVC tools. Manifest files named as sources of .exe and .dll targets will be merged with linker-generated manifests and embedded in the binary.
    Ответ написан
    Комментировать
  • Как скомпилировать в один большой запускной файл?

    Nipheris
    @Nipheris Куратор тега C++
    он зависит от большого количества so-библиотек.

    У вас два варианта:
    1. Использовать статические варианты библиотек вместо динамических (so) - это то, что предлагает Vitaly.
    2. Продолжать собирать как сейчас, но научиться собирать нормальные пакеты под нужные вам дистрибутивы, с нормальным описанием зависимостей - тогда системный пакетный менеджер при установке вашего пакета поставит все нужные вам зависимости.

    Второй вариант сложнее, но предпочтительнее, т.к. в случае критических уязвимостей в библиотеках их можно будет обновить независимо без обновления вашего приложения. Когда вы линкуете статически, очевидно что уязвимый код в вашем бинарнике можно обновить только пересборкой этого бинарника с новой версией библиотеки, т.е. без вашего участия (если код закрыт) уязвимость не устранить. Критично ли это для вас или нет - решать вам, зависит от важности вашего приложения.
    Ответ написан
    Комментировать
  • Как корректно собрать C++ CUDA проект через Cmake на Linux?

    Nipheris
    @Nipheris Куратор тега C++
    cuda_compile(CudaKernel src/CUDA.cu)
    cuda_add_library(CudaKernels src/CUDA.cu)

    Подозрительно разные идентификаторы, это точно так надо? Зачем вообще этот cuda_compile? Если вы его используете, тогда вам надо то что он положит в CudaKernel подставить в cuda_add_library, например cuda_add_library(CudaKernels ${CudaKernel})

    cuda_add_executable(Mandelbrot_set $(SOURCE_FILES) CudaKernels)

    Странная конструкция. Если CudaKernels это таргет, что он делает в этом списке, где должны быть исходники?

    И должен ли src/CUDA.cu компилится дважды?
    Ответ написан
    3 комментария
  • Как добавить свой тип сборки в cmake?

    Попробуйте поместить эти set-ы перед директивой project, иногда это помогает.
    Ответ написан
    Комментировать
  • Как автоматически экспортировать зависимости к проекту, собранному через Cmake?

    О каких системах идёт речь? Если о debian-семействе, то почему бы не собрать пакет? На линуховых дистрах обычно принято динамические зависимости пакетным менеджером удовлетворять.

    Собрать пакет вам поможет CPack. Вот например переменная, куда нужно перечислять пакеты-зависимости: CPACK_DEBIAN_PACKAGE_DEPENDS.
    Ответ написан
  • Почему llvm-build не видит новый бэкенд?

    Попробуйте добавить ваш таргет Abc в список LLVM_ALL_TARGETS, находится в корневом CMakeLists. С этим списком потом всякие вещи делаются, мне кажется там должны быть вообще все таргеты, которые есть в проекте.
    Ответ написан