Создание библиотеки с использованием автоинструментов из cmake

Я на самом деле требовал бы выбирать более простой язык с меньшим количеством инструкций. Я лично учился на ОСНОВНОМ дома, поскольку сделал Jeff. Таким образом, Вы не должны копаться в более сложных проблемах как объектно-ориентированное программирование, или даже процедурах, если Вы не хотите. Как только он может обработать простой поток управления, затем углубить к чему-то немного более сложные, но только простые функции.

, Возможно, запускаются с очень простых программ, которые просто добавляют 2 числа, и затем растут до чего-то, что могло бы потребовать ответвления, тогда возможно, читая вход и ответив на него, тогда некоторый цикл, и начинать комбинировать их всех вместе. Только запустите мало и проложите себе путь. Не делайте никаких больших проектов, пока он не может схватить основные принципы (иначе, это может быть слишком пугающим, и он мог сдаться на полпути). Как только он освоил ОСНОВНОЙ или независимо от того, что Вы выбираете, движение к чему-то более сложному.

Просто мои 0,02$

33
задан Julio Guerra 14 June 2011 в 22:07
поделиться

1 ответ

Я должен был сделать что-то подобное, но нашел удивительно трудным получить рабочее решение, несмотря на пример, обеспеченный здесь принятым ответом и фрагментами кода, обеспеченными в нескольких других сообщениях в блоге, CMake поддерживают электронную почту listserv архивы, и т.д. В пользу других, которые сталкиваются с этим вопросом, вот мое решение.

внешний проект, который мы хотели использовать, libmodbus, хотя я полагаю, что мое решение является достаточно общим для работы с любым проектом, настроенным со стандартом autoconf рецепт ./autoconf.sh && configure.sh && make && make install.

Мы хотели добавить libmodbus как подмодуль нашего репозитория мерзавца. Мы добавили к нашему репозиторию в пути <root>/opt/libmodbus. Эти CMake код для конфигурирования его расположен в <root>/cmake/modbus.cmake, который включен от нашего корня CMakeLists.txt использование

# libmodbus
include(cmake/modbus.cmake)

, содержание [1 111]:

include(ExternalProject)

set(MODBUS_DIR ${CMAKE_CURRENT_SOURCE_DIR}/opt/libmodbus)
set(MODBUS_BIN ${CMAKE_CURRENT_BINARY_DIR}/libmodbus)
set(MODBUS_STATIC_LIB ${MODBUS_BIN}/lib/libmodbus.a)
set(MODBUS_INCLUDES ${MODBUS_BIN}/include)

file(MAKE_DIRECTORY ${MODBUS_INCLUDES})

ExternalProject_Add(
    libmodbus
    PREFIX ${MODBUS_BIN}
    SOURCE_DIR ${MODBUS_DIR}
    DOWNLOAD_COMMAND cd ${MODBUS_DIR} && git clean -dfX && ${MODBUS_DIR}/autogen.sh
    CONFIGURE_COMMAND ${MODBUS_DIR}/configure --srcdir=${MODBUS_DIR} --prefix=${MODBUS_BIN} --enable-static=yes --disable-shared
    BUILD_COMMAND make
    INSTALL_COMMAND make install
    BUILD_BYPRODUCTS ${MODBUS_STATIC_LIB}
)

add_library(modbus STATIC IMPORTED GLOBAL)

add_dependencies(modbus libmodbus)

set_target_properties(modbus PROPERTIES IMPORTED_LOCATION ${MODBUS_STATIC_LIB})
set_target_properties(modbus PROPERTIES INTERFACE_INCLUDE_DIRECTORIES ${MODBUS_INCLUDES})

компонент А, который использует libmodbus, может объявить свою зависимость, как обычно:

    add_executable(hello_modbus main.cpp)
    target_link_libraries(hello_modbus modbus)

Несколько примечаний:

  1. Это злоупотребляет DOWNLOAD_COMMAND для выполнения эти autogen.sh шаг. Эти git clean -dfX, вероятно, не необходимо (это - остаток от более ранней версии, которая использовала BUILD_IN_SOURCE опция. Если Вы действительно захотите загрузить код вместо того, чтобы использовать подмодуль мерзавца, то необходимо будет изменить эту строку соответственно.
  2. Мы переходим к проблеме для принуждения статически-единственной сборки библиотеки. Скорректируйте Ваш configure командная строка, если Вы хотите совместно использованные библиотеки.
  3. Эти set_target_properties управляют для установки эти IMPORTED_LOCATION, перестанет работать без BUILD_BYPRODUCTS ${MODBUS_STATIC_LIB} объявление.
  4. Аналогично, эти set_target_properties команда для установки эти INTERFACE_INCLUDE_DIRECTORIES перестанет работать без file(MAKE_DIRECTORY ${MODBUS_INCLUDES}).
0
ответ дан 27 November 2019 в 18:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: