Подтвердить что ты не робот

Создание файла CMakeLists из существующего Makefile

Я хочу использовать cmake для создания моих файлов сборки для проекта на С++. У меня есть существующий Makefile. У меня возникают проблемы с созданием этого Makefile с использованием стандартного синтаксиса cmake.

Как включить стандартные библиотеки С++, такие как -lstdc++ -lpthread -lboost_thread-mt в разделе TARGET_LINK_LIBRARIES cmake? Или эти файлы должны быть включены в раздел ADD_DEPENDENCIES.

(ИЛИ) Есть простой инструмент, который генерирует файл CMakeList.txt из Makefile

4b9b3361

Ответ 1

К сожалению, нет простого преобразования 1:1 из Makefile в CMakeLists. Поскольку CMake предполагается запускать на всех платформах, он не может полагаться на определенные платформой предположения, такие как GNU make, что усложняет ситуацию в определенных местах.

В частности, CMake предлагает очень мощный и довольно сложный механизм для использования библиотек: вы вызываете find_package имя вашей библиотеки, которое будет вызывать библиотеку выполните поиск script с вашего пути к модулю cmake. Этот script (который также написан в CMake) попытается определить местоположение заголовков библиотеки и файлов lib и сохранить их в нескольких переменных CMake, которые затем могут быть переданы в соответствующие команды CMake, такие как include_directories и target_link_libraries.

При таком подходе есть две проблемы: во-первых, вам нужен поиск script. К счастью, CMake поставляется с поисковыми скриптами для Pthreads, Boost и еще нескольких других, но если вы используете более экзотическую библиотеку, вам, возможно, придется самому написать поиск script, который сначала является загадочным опытом..

Вторая серьезная проблема заключается в том, что нет стандартного способа поиска script для возврата его результатов. Хотя существуют условные обозначения для используемых переменных, они часто не применяются. На практике это означает, что вам нужно будет проверить источник поиска script, чтобы узнать, как его использовать. К счастью, сценарии, которые поставляются с CMake, в основном хорошо документированы.

Встроенные скрипты расположены где-то вроде <cmake-install-prefix>/share/cmake-2.8/Modules. Для вашего вопроса посмотрите файлы FindBoost.cmake и FindThreads.cmake(CMake должен автоматически ссылаться на стандартную библиотеку). Anycorn уже дал пример кода для использования Boost script, все, что вам нужно знать, находится в документации CMake или непосредственно в файлах поиска script.

Ответ 2

Вот так:

target_link_libraries(your-target-name pthread boost_thread-mt etc)

Вы не должны использовать add_dependencies, если хотите связать библиотеки. Связывание подразумевает зависимость, но сама зависимость не будет достаточной, если вам нужно связать.

Ответ 3

С Boost вам действительно нужно использовать поиск пакетов

  set(Boost_ADDITIONAL_VERSIONS "1.46" "1.46.0" "1.46.1")
  set(Boost_USE_MULTITHREADED ON) # for -mt
  find_package(Boost COMPONENTS thread)
  if(Boost_FOUND)
    MESSAGE(STATUS "Found Boost: ${Boost_LIBRARY_DIRS}")
    MESSAGE(STATUS "Found Boost libraries: ${Boost_LIBRARIES}")
    set(LIBRARIES "${LIBRARIES};${Boost_LIBRARIES}")
  else()
    MESSAGE(FATAL_ERROR "Boost Thread NOT FOUND")
  endif()

target_link_libraries(executable ${LIBRARIES})