Manajemen ketergantungan seperti Maven untuk C ++? [Tutup]


94

Katakanlah saya memiliki proyek C ++ yang terbagi dalam beberapa subproyek. Semua subproyek menghasilkan DLL dan tim pengembang yang berbeda mengerjakan setiap subproyek. Sekarang jika saya ingin membangun proyek utama, apakah ada cara untuk menghindari keharusan membangun semua subproyek sendiri?

Singkatnya, saya mencari sesuatu yang melakukan manajemen ketergantungan (yaitu untuk file biner dan header) dengan cara yang sama seperti yang dilakukan Maven untuk Java.

Sebenarnya, saya mencoba menggunakan Maven untuk ini tetapi ini agak rumit karena saya harus membuat paket secara manual dan cukup sering, Maven ketinggalan untuk mengambil perubahan terbaru. Selain itu, menjalankan kompilasi sedikit merepotkan karena saya harus memanggil NAnt dari dalam Maven (saya menggunakan fitur NAnt untuk membangun solusi Visual Studio secara langsung).

Ada petunjuk dan ide tentang cara melakukan ini?


Masalah saat menggunakan make adalah saya harus membangun semuanya setidaknya sekali dan karena itu juga membutuhkan file sumber untuk dependensi. Terutama, saat membangun kembali pustaka yang bergantung, ini bisa sangat memakan waktu dan sangat memengaruhi produktivitas. Atau apakah saya melewatkan sesuatu?
weberste

3
Ini sepertinya pertanyaan yang berguna. Mungkin pertanyaan ini dapat dipindahkan ke situs lain yang lebih menyambut pertanyaan ini? Saya mencari praktik terbaik untuk manajemen ketergantungan c ++.
simgineer

Ini terlambat sekitar 10 tahun jadi ada 3 kemungkinan di sini: Anda menyalahgunakan maven, Anda melewatkan keseluruhan poin maven, atau 10 tahun yang lalu ketika saya tidak menggunakan mavenuntuk C ++, itu jauh kurang berguna untuk C ++. Saya tidak dapat berbicara untuk tahun 2009, tetapi dalam beberapa tahun terakhir dari pengalaman, mavenitulah yang akan Anda gunakan untuk masalah yang Anda gambarkan. Ia melakukan persis apa yang Anda inginkan, dan cukup efisien dan baik, dan tidak melakukan hal-hal negatif yang Anda klaim. Siapa pun yang membaca ini pada tahun 2019 atau yang lebih baru harus sangat mempertimbangkan mavenuntuk menggunakan untuk tujuan ini.
searchengine27

Jawaban:


37

Jawaban Awal : Saya akan menyarankan menggunakan CMake. Ini adalah pembuat file buat multi-platform (menghasilkan proyek Visual Studio atau Eclipse CDT juga).

http://www.cmake.org/

Saya melakukan pengalaman yang sangat bagus dengannya. Hal terbaik yang saya sukai adalah kemampuannya untuk menghasilkan struktur proyek yang umum. Jadi Anda secara umum dapat menyertakan pencarian subproyek untuk pengujian unit dll. Tanpa mengubah skrip setiap saat.

Mereka juga memiliki banyak modul tentang cara menemukan pustaka build yang sudah diinstal sebelumnya, yang diperlukan untuk proyek (seperti Boost, QT, dll.)


Pembaruan : Sementara itu ada beberapa upaya untuk memperkenalkan manajemen paket untuk C ++. Beberapa proyek yang layak untuk dilihat:

  • conan.io terintegrasi dengan alat pembangunan utama:
    • CMake
    • Studio visual
    • Makefile
    • Xcode
    • ...
  • cpm berdasarkan CMake ( Catatan CPM tidak dipertahankan secara aktif.)
  • Buckaroo

Catatan seperti yang ditunjukkan oleh @RAM di komentar cpm tidak lagi aktif dipertahankan.


7
Saya menggunakan CMake beberapa bulan yang lalu dan memang, memeriksa perpustakaan pra-instal bekerja dengan sangat baik. Namun, ketergantungan biner lainnya (yaitu yang berasal dari subproyek saya) tidak dapat dikelola dengan mudah. Apakah saya melewatkan sesuatu?
weberste

3
@weberste, Sebenarnya tidak ada tool maven like untuk C / C ++. Pengembang mencoba menangani manajemen ketergantungan dengan alat seperti apt-get.
SunnyShah

1
cpm tidak aktif dipertahankan dan telah mati sejak awal 2015.
RAM

@ RAM: terima kasih telah menunjukkannya. Saya telah menambahkan catatan di posting dengan referensi untuk Anda.
ovanes

2
CMake adalah sistem build dengan kemampuan terbatas untuk menemukan dependensi. Ini bukan manajer ketergantungan dalam arti NPM, Cargo, dll.
sdgfsdh

17

Untuk manajemen ketergantungan, ada proyek baru (itu adalah perusahaan startup) yang mengimplementasikan jenis alat ini: https://github.com/biicode (manajer ketergantungan C ++). Anda dapat menambahkan dependensi Anda dan itu akan berfungsi.

Saat ini, nama proyeknya adalah conan.io , mereka diakuisisi oleh JFrog .

PEMBARUAN: Proyek ini mati ... Sayangnya, tampaknya startup tidak bisa mendapatkan cukup pelanggan yang membayar premium, tetapi server tampaknya berfungsi dengan baik ...

UPDATE2: Sepertinya ada proyek pengganti: conan.io (terima kasih @mucaho)


Saya dapat menghapus tautannya .. proyek ditutup, sekarang conan.io
carlos.baez

Terima kasih atas pembaruannya! Saya kebanyakan hanya melihat-lihat karena penasaran, sepertinya masih mungkin untuk melihat-lihat github mereka untuk dokumentasi ; Mungkin tidak sebagus apa yang ada di situs web pada satu titik tapi saya rasa itu lebih baik daripada tidak sama sekali. Hanya bertanya-tanya, apakah conan.io hanya perubahan merek atau produk yang sama sekali berbeda?
jrh

1
Bukan perubahan merek tetapi proyek yang benar-benar baru dari awal dengan semua pelajaran yang dipetik: sumber terbuka sepenuhnya, terdesentralisasi sepenuhnya dengan server internal, mendukung semua sistem build, mengelola biner.
drodri

8

Saya merekomendasikan sistem build tingkat tinggi berikut:


Plugin Maven Nar mendapatkan dukungan yang baik. Saya menggunakannya dan saya suka sejauh ini. Namun Anda perlu memahami bahwa Maven tidak bagus untuk mono repo. Sebagian besar solusi C ++ membutuhkan pustaka berbagi pegangan Mono repo dan semacamnya.
Hans

5

Jika Anda hanya ingin manajemen ketergantungan, coba Ivy , ini terintegrasi dengan baik dengan Ant (dan saya berasumsi NAnt dapat melakukan hal yang sama berdasarkan blog ini , yang ditautkan dari situs Ivy).

Ada juga Byldan , versi .Net dari Maven. Tidak tahu seberapa baik itu akan berhasil untuk Anda.


3

Make dan GCC adalah kombinasi yang bagus untuk pemeriksaan dependensi yang sangat bagus.

GCC dapat menghasilkan file dependensi 'make' secara otomatis (-MD commandline switch), sehingga dapat membangun kembali semua file sumber yang bergantung pada header tertentu, misalnya.

Saya memiliki beberapa aturan sederhana yang saya potong-n-tempel ke makefile saya:

# compile c files   
%.o:    %.c
    ${CC} ${CFLAGS} -c $< -MD -MF $(<:%.c=%.dep) -o $@

# compile c++ files
%.opp:  %.cpp
    ${CPP} ${CPPFLAGS} -c $< -MD -MF $(<:%.cpp=%.dep) -o $@

Sekarang jika file objek Anda dideklarasikan, katakanlah OBJ_C dan daftar OBJ_CPP:

.PHONY: cleandep
cleandep:
    rm -f $(OBJ_C:%.o=%.dep) $(OBJ_CPP:%.opp=%.dep)

-include $(OBJ_C:%.o=%.dep) $(OBJ_CPP:%.opp=%.dep)

Make tentu saja dapat melacak ketergantungan dengan proyek lain dan semacamnya, misalnya membangun kembali perpustakaan bersama sebagaimana diperlukan, juga.

Misalnya, jika tim Anda yang lain selalu meletakkan DLL terbaru mereka di beberapa folder bersama:

myapp: ${SRC_CPP} ${LIB_DIR}other_team.lib
  ...

${LIB_DIR}other_team.lib: /shared_folder/latest/other_team.lib
  cp /shared_folder/latest/other_team.lib ${LIB_DIR}other_team.lib

lihat komentar saya yang dilampirkan pada pertanyaan mengenai masalah saya dengan solusi ini
weberste

Jika target bergantung pada file lain, misalnya file yang dapat dieksekusi bergantung pada pustaka bersama, Anda dapat memiliki aturan untuk pustaka bersama itu yang memastikan salinan pustaka Anda mutakhir tanpa memerlukan sumbernya, misalnya dengan hanya mengambil salinan terbaru dari lokasi tertentu atau dari menjalankan beberapa pembaruan kontrol versi atau semacamnya.
Akankah

${CC} ${CFLAGS} -c $< -MD -MF $(<:%.c=%.dep) -o $@Saya mengalami kesulitan mem-parsing semua simbol Make ini, sepertinya ini menyelesaikan sesuatu seperti g++ -c main.cc -MD -MF testjika Anda ingin menjalankannya secara mandiri di baris perintah, dan ini menempatkan hasilnya dalam file bernama 'test'.
jrh


2

Saya merekomendasikan conan , yang saya gunakan hari ini. Sangat kuat untuk mempertahankan semua pustaka dan binari dependen dalam proyek Anda.


1

Anda dapat membuat paket NuGet untuk perpustakaan bekas dan menggunakan NuGet untuk manajemen ketergantungan.

Lihat juga, NuGet untuk C ++


1
NuGet adalah ekstensi Visual Studio
Toughy

@Toughy, ini juga dapat digunakan sebagai manajemen ketergantungan mandiri. (4M file yang dapat dieksekusi)
Yousha Aleayoub

0

Ada sejumlah alat yang duduk di atas SCons, menyediakan fungsionalitas tingkat tinggi yang mirip dengan Autotools yang mencoba membuat hidup para pengembang lebih mudah (misalnya WAF, SNOCS). Sayangnya, SCons sendiri memiliki kelemahan utama - waktu kompilasi yang lebih lama untuk proyek-proyek besar.

Saya dapat merekomendasikan untuk mencoba SNOCS (yang merupakan SCons terbalik) bagi Anda yang mencari manajemen ketergantungan yang mudah dan memilih opsi kompilasi dalam satu perintah (kompilator, x86 / x64, Debug / Rilis, perpustakaan statis / bersama, tes / memasang target, dll.).

SNOCS juga mencoba untuk mengatasi masalah waktu kompilasi yang lama dengan menyimpan keluaran konfigurasi proyek dalam file terpisah, yang memungkinkan build konsekuen melewati fase konfigurasi sama sekali dan langsung ke fase pembangunan (fitur terakhir sedang dibangun sekarang)

Konfigurasi CMake menjadi membosankan dalam solusi yang lebih besar, sehingga pemeliharaan sistem build membutuhkan banyak waktu pengembang. Untungnya, seperti yang telah disebutkan Martijn, ada biicode yang "menggunakan CMake untuk menghasilkan proyek Anda dengan dependensinya".


-1

Coba SCons

SCons adalah alat konstruksi perangkat lunak Open Source — yaitu, alat build generasi berikutnya. Pikirkan SCons sebagai pengganti lintas platform yang ditingkatkan untuk utilitas Make klasik dengan fungsionalitas terintegrasi yang mirip dengan autoconf / automake dan cache kompiler seperti ccache. Singkatnya, SCons adalah cara yang lebih mudah, lebih andal, dan lebih cepat untuk membangun perangkat lunak.


3
SCons tidak memiliki manajemen dependensi atau repositori bawaan seperti yang diminta.
Maxime Viargues

-3

Saya merekomendasikan untuk menggunakan ibu dari semua sistem ketergantungan build: make.


Saya menggunakan ini secara ekstensif. GCC bisa membuat file dependensi yang 'membuat' bisa makan. Cukup untuk jawaban lain, mungkin ...
Akankah

8
make sebenarnya adalah apa yang semua orang ingin hindari / ganti dengan melihat build
-automation-

-6

Coba scon, Anda akan ketagihan. Membuat sudah ketinggalan zaman, sulit dan mahal perawatannya.


Saya telah melihat Scons tetapi tidak menemukan cara untuk mengelola dependensi biner. Apakah Anda punya contoh untuk ini?
weberste

1
Karena scons adalah python, Anda dapat membuat kode apa pun yang Anda inginkan untuk mengelola dependensi biner Anda dengan cukup mudah. Mungkin memiliki "SConscript" di direktori dependensi biner Anda juga membantu. Saya tidak yakin apa persyaratan Anda di sini sulit. Pedro.
piotr

16
Jadi Anda menyarankan alat berdasarkan "Saya tidak yakin apa yang Anda butuhkan, tetapi Anda dapat memprogramnya sendiri dengan Python". Lalu mengapa Anda membutuhkan scon?
jalf
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.