2013-04-06 1 views
10

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

+2

CMake должен это сделать. – JosephH

+0

Как вы автоматически устанавливаете зависимости от Windows? – gongzhitaao

ответ

3

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

Короткий ответ - пусть 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 
) 

Вы должны принять это и создать проекты визуальной студии, make-файлы и т. Д. Затем создайте проект, как обычно.

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

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

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

Вот пример:

https://github.com/tomisarobot/curl_race

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

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

1

Немногие мысли

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

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

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

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

2) Язык

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

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

: использование библиотек, которые могут помочь абстрактные системные вызовы в единый интерфейс (для всех систем). – scones

+0

+1: да, абсолютно. – Arun

Смежные вопросы