2013-04-06 24 views
10

Chciałbym rozpocząć projekt C++ na GitHub tak, że będę mógł klonować/budować na różnych systemach operacyjnych (na przykład OSX i unix). Będzie trzeba zainstalować wiele zależności (na przykład curl, libxml2, itp.) I bardzo chciałbym uniknąć konieczności ręcznego instalowania depów w systemie. Czy można to zrobić?Jak skonfigurować projekt C++ na github, aby był przenośny?

+2

CMake powinien to zrobić. – JosephH

+0

Jak automatycznie zainstalować zależności w systemie Windows? – gongzhitaao

Odpowiedz

3

To zależy od tego, jak bardzo chcesz odgryźć.

Krótka odpowiedź to niech CMake wykona pracę. Będzie generować projekty dla dowolnej platformy i powinny być użyteczne. Nie musisz potrzebujesz do dystrybucji plików binarnych, zakładając, że są one łatwo dostępne (i dla nich, przez rozszerzenie).

Oto przykład ustawienia sqlite, boost i eigen używanego w jednym z moich projektów.

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 
) 

Zrobiłbyś to i wygenerowałbyś projekty studyjne, pliki makefile, itd. Następnie zbuduj projekt tak jak zwykle.

CMake obsługuje wiele bibliotek po wyjęciu z pudełka, chociaż czasami trzeba google dla mniej popularnych i dodać je do projektu.

Używam go do codziennej pracy, nawet gdy nie potrzebuję platformy krzyżowej.

Kiedy faktycznie chcę dystrybuować pliki binarne, zazwyczaj instaluję zewnętrzny folder z plikami binarnymi.

Oto przykład:

https://github.com/tomisarobot/curl_race

Działa to doskonale, jeśli nie masz dużo zależności zewnętrzne, a jeśli nie są one ogromne. Jeśli tak nie jest, to polecam umieszczanie każdej wersji w różnych repozytoriach. Twoje źródło powinno również być w swoim. Możesz użyć podprojektów, jeśli chcesz, choć nie jest to absolutnie konieczne. Zewnętrzne depsy nie zmieniają się tak często, więc nie zawsze jest to warte narzutu. Zwykle po prostu piszę skrypt basha, aby udokumentować, skąd wziąć wszystko. Ten skrypt jest zwykle potrzebny do budowy dystrybucji.

Rzeczy takie jak maven-nar-plugin istnieją, chociaż nie jestem świadomy ich dojrzałości. Jeśli tworzysz wszystkie pliki binarne, które chcesz rozpowszechniać ze swojego źródła, to może nie jest to tak atrakcyjne. Nie widzę wiele o tym mówić, więc zakładam, że adopcja jest niska. Widząc, co maven robi dla Javy, powinno być bardziej popularne.

1

Kilka myśli

1) Narzędzia

  • Gdy jest to możliwe, w tym źródeł narzędziem w repozytorium tak, że można zbudować je jako pierwszy raz tylko krok

  • When nie jest możliwe, należy jasno określić, jaka minimalna wersja narzędzia jest wymagana, aby użytkownik mógł sam je zainstalować:

    • Być może sprawdzić, czy są spełnione wymagania zależnościami uruchamiając skrypt

2) Język

skompilować z ścisłego przestrzegania językowej. Na przykład:

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

również: może pomóc wykorzystanie bibliotek, do których abstrakcyjne wywołania systemowe mogą zostać wykorzystane w jednolitym interfejsie (dla wszystkich systemów). – scones

+0

+1: tak, absolutnie. – Arun