Quản lý phụ thuộc giống Maven cho C ++? [đóng cửa]


94

Giả sử tôi có một dự án C ++ được chia thành nhiều dự án con. Tất cả các tiểu dự án đều tạo ra một DLL và các nhóm nhà phát triển khác nhau làm việc trên mỗi tiểu dự án. Bây giờ nếu tôi muốn xây dựng dự án chính, có cách nào để tránh phải tự mình xây dựng tất cả các dự án phụ không?

Tóm lại, tôi đang tìm kiếm thứ gì đó thực hiện quản lý phụ thuộc (tức là đối với tệp nhị phân và tiêu đề) theo cách tương tự như Maven làm cho Java.

Trên thực tế, tôi đã cố gắng sử dụng Maven cho việc này nhưng điều này khá phức tạp vì tôi phải tạo các gói theo cách thủ công và khá thường xuyên, Maven bỏ lỡ những thay đổi gần đây nhất. Ngoài ra, việc chạy biên dịch cũng hơi khó vì tôi phải gọi NAnt từ bên trong Maven (tôi sử dụng tính năng của NAnt để xây dựng các giải pháp Visual Studio trực tiếp).

Bất kỳ gợi ý và ý tưởng về cách làm điều này?


Vấn đề khi sử dụng make là tôi phải xây dựng mọi thứ ít nhất một lần và do đó cũng cần các tệp nguồn cho các phụ thuộc. Đặc biệt, khi xây dựng lại các thư viện phụ thuộc, nó có thể rất tốn thời gian và ảnh hưởng nghiêm trọng đến năng suất. Hay tôi đang thiếu cái gì đó?
weberste,

3
Đây có vẻ như là một câu hỏi hữu ích. Có thể câu hỏi này có thể được chuyển sang một trang web khác chào đón những câu hỏi này hơn? Tôi đang tìm kiếm các phương pháp hay nhất để quản lý phụ thuộc c ++.
simgineer

Điều này đã muộn khoảng 10 năm nên có 3 khả năng xảy ra ở đây: bạn đang sử dụng sai maven, bạn đang thiếu toàn bộ ý kiến maven, hoặc 10 năm trước khi tôi không sử dụng mavencho C ++, điều đó ít hữu ích hơn cho C ++. Tôi không thể nói năm 2009, nhưng trong những năm gần đây, theo kinh nghiệm, đó mavenchính xác là những gì bạn sẽ sử dụng cho vấn đề bạn đang mô tả. Nó làm chính xác những gì bạn muốn, khá hiệu quả và tốt, và không làm những điều tiêu cực mà bạn cho rằng nó làm. Bất cứ ai đọc cuốn sách này vào năm 2019 trở lên nên cân nhắc sử dụng mavencho mục đích này.
searchhengine27

Câu trả lời:


37

Câu trả lời ban đầu : Tôi khuyên bạn nên sử dụng CMake. Nó là một trình tạo tệp đa nền tảng (tạo cả các dự án Visual Studio hoặc Eclipse CDT).

http://www.cmake.org/

Tôi đã có trải nghiệm thực sự tốt với nó. Điều tốt nhất tôi thích về nó là khả năng tạo ra cấu trúc dự án chung. Vì vậy, thông thường bạn có thể bao gồm tra cứu các dự án con cho các bài kiểm tra đơn vị, v.v. mà không cần thay đổi tập lệnh mỗi lần.

Họ cũng có rất nhiều mô-đun về cách tìm các thư viện bản dựng được cài đặt sẵn, cần thiết cho dự án (như Boost, QT, v.v.)


Cập nhật : Trong thời gian đó, đã có một số nỗ lực để giới thiệu quản lý gói cho C ++. Một số dự án đáng xem:

  • conan.io tích hợp với các công cụ xây dựng chính:
    • CMake
    • Visual Studio
    • Makefile
    • XCode
    • ...
  • cpm dựa trên CMake ( Lưu ý rằng CPM không được duy trì tích cực.)
  • Buckaroo

Lưu ý như được chỉ ra bởi @RAM trong nhận xét cpm không còn được duy trì tích cực.


7
Tôi đã sử dụng CMake vài tháng trước và thực sự, việc kiểm tra các thư viện được cài đặt sẵn hoạt động rất tốt. Tuy nhiên, các phụ thuộc nhị phân khác (tức là các phụ thuộc đến từ các dự án con của tôi) không thể được quản lý dễ dàng. Tui bỏ lỡ điều gì vậy?
weberste,

3
@weberste, Trên thực tế không có công cụ giống maven nào cho C / C ++. Các nhà phát triển cố gắng xử lý việc quản lý sự phụ thuộc bằng công cụ apt-get like.
SunnyShah

1
cpm không được bảo trì tích cực và đã chết từ đầu năm 2015.
RAM

@RAM: cảm ơn vì đã chỉ ra điều đó. Tôi đã thêm một ghi chú trong bài đăng có liên quan đến bạn.
buồng trứng

2
CMake là một hệ thống xây dựng với khả năng hạn chế để tìm các phụ thuộc. Nó không phải là một người quản lý phụ thuộc vào cảm giác của NPM, hàng hóa, vv
sdgfsdh

17

Đối với quản lý phụ thuộc, nó tồn tại một dự án mới (đó là một công ty khởi nghiệp) đang triển khai loại công cụ này: https://github.com/biicode (một trình quản lý phụ thuộc C ++). Bạn có thể thêm các phụ thuộc của mình và nó sẽ hoạt động.

Hiện tại, tên dự án là conan.io , họ đã được mua lại bởi JFrog .

CẬP NHẬT: Dự án đã chết ... Thật không may, có vẻ như công ty khởi nghiệp không thể có đủ khách hàng trả phí bảo hiểm, nhưng máy chủ có vẻ đang hoạt động tốt ...

CẬP NHẬT2: Có vẻ như có một dự án thay thế: conan.io (cảm ơn @mucaho)


Tôi có thể xóa liên kết .. dự án đã bị đóng, bây giờ là conan.io
carlos.baez

Cảm ơn các cập nhật! Tôi chủ yếu chỉ tìm kiếm vì tò mò, có vẻ như vẫn có thể xem xét trên github của họ để tìm tài liệu ; Nó có thể không đẹp như những gì trên trang web tại một thời điểm nhưng tôi đoán nó còn hơn không. Chỉ tự hỏi, conan.io chỉ là một thương hiệu mới hay nó là một sản phẩm hoàn toàn khác?
jrh

1
Không phải là đổi thương hiệu mà là một dự án hoàn toàn mới từ đầu với tất cả các bài học kinh nghiệm: hoàn toàn mã nguồn mở, hoàn toàn phi tập trung với máy chủ nội bộ, hỗ trợ tất cả các hệ thống xây dựng, quản lý tệp nhị phân.
drodri

8

Tôi đề xuất các hệ thống xây dựng cấp cao sau:


Plugin Maven Nar nhận được sự hỗ trợ tốt. Tôi đã sử dụng nó và tôi thích cho đến nay. Tuy nhiên bạn cần hiểu rằng Maven không tốt cho một repo đơn. Hầu hết các giải pháp C ++ cần một thư viện chia sẻ bộ xử lý Mono repo và như vậy.
Hans

5

Nếu bạn chỉ muốn quản lý phụ thuộc, hãy thử Ivy , nó tích hợp độc đáo với Ant (và tôi cho rằng NAnt cũng có thể làm điều tương tự dựa trên blog này , được liên kết từ trang Ivy).

Ngoài ra còn có Byldan , một phiên bản .Net của Maven. Tuy nhiên, không biết điều đó sẽ hiệu quả với bạn như thế nào.


3

Make và GCC là một sự kết hợp tuyệt vời để kiểm tra độ phụ thuộc thực sự tốt.

GCC có thể tự động tạo các tệp phụ thuộc 'tạo' (chuyển đổi dòng lệnh -MD), để có thể xây dựng lại tất cả các tệp nguồn phụ thuộc vào một tiêu đề nhất định, chẳng hạn.

Tôi có một số quy tắc đơn giản mà tôi cắt-n-dán vào trang điểm của mình:

# 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 $@

Bây giờ nếu các tệp đối tượng của bạn được khai báo trong danh sách OBJ_C và OBJ_CPP:

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

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

Tất nhiên, Make có thể theo dõi sự phụ thuộc với các dự án khác và như vậy, chẳng hạn như xây dựng lại một thư viện dùng chung nếu cần.

Ví dụ: nếu các nhóm khác của bạn luôn đặt các tệp DLL mới nhất của họ trên một số thư mục chia sẻ:

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

xem xét của tôi gắn liền với những câu hỏi liên quan mối quan tâm của tôi với giải pháp này
weberste

Nếu mục tiêu phụ thuộc vào tệp khác, ví dụ tệp thực thi của bạn phụ thuộc vào thư viện được chia sẻ, bạn có thể có quy tắc cho thư viện được chia sẻ đó để đảm bảo bản sao thư viện của bạn được cập nhật mà không cần nguồn, ví dụ: chỉ cần tìm nạp bản sao mới nhất từ ​​một vị trí cụ thể hoặc từ việc thực hiện một số cập nhật kiểm soát phiên bản hoặc tương tự.
Will

${CC} ${CFLAGS} -c $< -MD -MF $(<:%.c=%.dep) -o $@Tôi đã gặp khó khăn khi phân tích tất cả các ký hiệu Make này, có vẻ như điều này giải quyết thành một thứ gì đó giống như g++ -c main.cc -MD -MF testnếu bạn muốn chạy nó độc lập tại dòng lệnh và nó đưa kết quả vào một tệp có tên 'test'.
jrh


2

Tôi giới thiệu conan , mà tôi đã sử dụng những ngày này. Nó rất mạnh mẽ để duy trì tất cả các thư viện và mã nhị phân phụ thuộc trong dự án của bạn.


1

Bạn có thể tạo gói NuGet cho các thư viện đã sử dụng và sử dụng NuGet để quản lý phụ thuộc.

Xem thêm, NuGet cho C ++


1
NuGet là một tiện ích mở rộng Visual Studio
Toughy

@Toughy, nó cũng có thể được sử dụng như một công cụ quản lý phụ thuộc độc lập. (4M tệp thực thi)
Yousha Aleayoub

0

Có một số công cụ nằm trên SCons, cung cấp chức năng cấp cao hơn tương tự như công cụ của Autotools đang cố gắng làm cho cuộc sống của các nhà phát triển dễ dàng hơn (ví dụ: WAF, SNOCS). Thật không may, bản thân SCons có nhược điểm lớn - thời gian biên dịch lâu hơn cho các dự án lớn.

Tôi có thể khuyên bạn nên dùng thử SNOCS (là một SCons bị đảo ngược) cho những người bạn đang tìm kiếm một quản lý phụ thuộc dễ dàng và chọn các tùy chọn biên dịch trong một lệnh (trình biên dịch, x86 / x64, Gỡ lỗi / Phát hành, thư viện tĩnh / chia sẻ, thử nghiệm / cài đặt mục tiêu, v.v.).

SNOCS cũng cố gắng giải quyết vấn đề thời gian biên dịch dài bằng cách lưu trữ đầu ra cấu hình dự án trong các tệp riêng biệt, cho phép các bản dựng do đó hoàn toàn bỏ qua giai đoạn cấu hình và chuyển thẳng đến giai đoạn xây dựng (tính năng cuối cùng hiện đang được xây dựng)

Cấu hình của CMake trở nên tẻ nhạt trong các giải pháp lớn hơn, do đó, việc bảo trì hệ thống xây dựng chiếm một phần lớn thời gian của nhà phát triển. May mắn thay như Martijn đã đề cập đến có mã sinh học "sử dụng CMake để tạo dự án của bạn với các phụ thuộc của nó".


-1

Thử SCons

SCons là một công cụ xây dựng phần mềm Nguồn mở — nghĩa là, một công cụ xây dựng thế hệ tiếp theo. Hãy nghĩ về SCons như một sự thay thế đa nền tảng, được cải tiến cho tiện ích Make cổ điển với chức năng tích hợp tương tự như autoconf / automake và bộ đệm biên dịch như ccache. Tóm lại, SCons là một cách dễ dàng hơn, đáng tin cậy hơn và nhanh hơn để xây dựng phần mềm.


3
SCons không có bất kỳ kho lưu trữ hoặc quản lý phụ thuộc nào như đã hỏi.
Maxime Viargues

-3

Tôi khuyên bạn nên sử dụng mẹ của tất cả các hệ thống phụ thuộc xây dựng: make.


Tôi sử dụng điều này rộng rãi. GCC có thể tạo các tệp phụ thuộc mà 'make' có thể ăn được. Đủ cho một câu trả lời khác, có lẽ ...
Sẽ

8
làm thực sự là những gì mọi người đều muốn tránh / thay thế bằng cách nhìn vào xây dựng hệ thống -automation-
chila

-6

Hãy thử scons, bạn sẽ bị mắc câu. Make đã lỗi thời, khó bảo trì và tốn kém.


Tôi đã xem xét Scons nhưng không tìm ra cách quản lý các phụ thuộc nhị phân. Bạn có một ví dụ cho điều này?
weberste,

1
Vì scons là python, bạn có thể viết bất cứ thứ gì bạn muốn để quản lý các phụ thuộc nhị phân của mình khá dễ dàng. Có lẽ có một "SConscript" trong thư mục của các phụ thuộc nhị phân của bạn cũng có ích. Tôi không chắc yêu cầu của bạn khó ở đây là gì. Pedro.
piotr 21-07-09

16
Vì vậy, bạn đang đề xuất một công cụ dựa trên "Tôi không chắc bạn cần gì, nhưng bạn có thể tự lập trình nó bằng Python". Tại sao bạn cần scons sau đó?
jalf
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.