Как настроить проект C++ на github, чтобы он был переносимым?

Я хотел бы запустить проект C++ на GitHub, чтобы я мог клонировать / строить на разных операционных системах (например, OSX и unix). Будет много зависимостей, которые необходимо установить (например, curl, libxml2 и т. д.), И как можно больше я хотел бы избежать необходимости пользователя вручную устанавливать deps в системе. Возможно ли это сделать?

2 ответов


Это зависит от того, сколько вы хотите откусить.

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

вот пример, который устанавливает sqlite, boost и eigen, которые я использовал для одного из моих проектов.

cmake_minimum_required(VERSION 2.8)
set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/Modules)

# boost
find_package(Boost 1.42.0 REQUIRED )
include_directories(${Boost_INCLUDE_DIRS})
link_directories(${Boost_LIBRARY_DIRS})

find_package(Eigen REQUIRED)
include_directories(${EIGEN_INCLUDE_DIRS})

find_package(Sqlite3 REQUIRED)
include_directories(${SQLITE3_INCLUDE_DIR})

set(CMAKE_CXX_FLAGS "-std=c++0x")

include_directories(.)

link_libraries(
    ${Boost_LIBRARIES}
    ${SQLITE3_LIBRARIES}
)

add_executable(igd_sqlite
    main.cpp
)

вы возьмете это и сгенерируете проекты visual studio, makefiles и т. д. Затем постройте проект, как обычно.

CMake поддерживает множество библиотек из коробки, хотя иногда вам приходится google для менее популярных и добавлять их в свой проект.

Я использую его для своей повседневной работы, даже когда мне не нужна кросс-платформа.

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

здесь пример:

https://github.com/tomisarobot/curl_race

это отлично работает, если у вас нет много внешних зависимостей, и если они не огромные. Когда это не так, я бы рекомендовал поместить каждую plattform в разные репозитории. Твой источник тоже должен быть в себе. Вы можете использовать подпроекты, если хотите, хотя это не обязательно. Внешние deps не меняют это часто, поэтому его не всегда стоит накладных расходов. Обычно я просто напишите сценарий bash, чтобы документировать, где все получить. Этот скрипт обычно необходим для сборки дистрибутива в любом случае.

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


несколько мыслей

1) Инструменты

  • когда это возможно, включите источники инструментов в репозиторий, чтобы их можно было построить как первый шаг

  • когда это невозможно, четко укажите, какая минимальная версия какого инструмента требуется, чтобы пользователь мог установить их сам

    • возможно, проверьте, удовлетворены ли требования зависимостей, запустив скрипт

2) Язык

Compile со строгим соблюдением языка. Например

   g++ -std=c++11 -pedantic