2009-07-16 35 views
66

Giả sử tôi có một dự án C++ được chia thành nhiều tiểu dự án. Tiểu dự án đều tạo ra một DLL và các nhóm 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 tiểu dự án không?Quản lý phụ thuộc giống như Maven cho C++?

Tóm lại, tôi đang tìm kiếm điều 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 dành cho Java. Trong thực tế, tôi đã cố gắng sử dụng Maven cho điều này nhưng điều này khá cồng kềnh vì tôi phải tạo các gói thủ công và khá thường xuyên, Maven nhớ để nhận các thay đổi gần đây nhất. Ngoài ra, chạy trình biên dịch là một chút của một hack như 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 nào về cách thực hiện việc này?

+0

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 một cái gì đó? – weberste

Trả lời

-1

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: thực hiện.

+0

Tôi sử dụng rộng rãi. GCC có thể tạo các tệp phụ thuộc 'thực hiện' có thể ăn. Đủ cho câu trả lời khác, có lẽ ... – Will

+7

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

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 giả định NAnt có thể làm tương tự dựa trên blog, được liên kết từ trang Ivy).

Ngoài ra còn có Byldan, phiên bản .Net của Maven. Không biết làm thế nào tốt sẽ làm việc cho bạn mặc dù.

3

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

GCC có thể tự động tạo tệp phụ thuộc 'make' (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, ví dụ.

Tôi có một số quy tắc đơn giản mà tôi cut-n-dán vào makefiles tôi:

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

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

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

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

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

Làm cho tất nhiên có thể theo dõi sự phụ thuộc với các dự án khác và như vậy, ví dụ xây dựng lại một thư viện được chia sẻ khi cần thiết.

Ví dụ, nếu các đội khác của bạn luôn đặt 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 
+0

xem bình luận của tôi gắn liền với câu hỏi liên quan đến mối quan tâm của tôi với giải pháp này – weberste

+0

tập tin 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ụ: bằng cách tìm nạp bản sao mới nhất từ ​​một vị trí cụ thể hoặc thực hiện một số cập nhật kiểm soát phiên bản hoặc như vậy. – Will

22

tôi sẽ đề nghị sử dụng CMake. Nó là một bộ tạo tập tin đa nền tảng (cũng tạo ra các dự án Visual Studio hoặc Eclipse CDT).

http://www.cmake.org/

tôi đã 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, bạn thường có thể bao gồm các dự án phụ tra cứu cho các bài kiểm tra đơn vị vv mà không thay đổi kịch bản mỗi lần.

Họ cũng có rất nhiều mô-đun trên làm thế nào để tìm được cài đặt sẵn xây dựng thư viện, cần thiết cho dự án (như Boost, QT, vv)


Cập nhật: Trong lúc này đã có một số nỗ lực để giới thiệu quản lý gói cho C++.Một số dự án đáng được xem xét:

  • conan.io tích hợp với công cụ xây dựng chính:
    • CMake
    • Visual Studio
    • Makefile
    • XCode
    • ...
  • cpm dựa trên CMake
+7

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

+2

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

-5

Hãy dùng thử, bạn sẽ được nối. Làm cho là lỗi thời, khó khăn và tốn kém để duy trì.

+0

Tôi đã có một cái nhìn tại Scons nhưng không tìm thấy một cách để quản lý 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ể mã bất cứ điều gì bạn muốn quản lý phụ thuộc nhị phân của bạn khá dễ dàng. Có lẽ có một "SConscript" trong thư mục phụ thuộc nhị phân của bạn cũng giúp. Tôi không chắc các yêu cầu của bạn ở đây là gì. Pedro. – piotr

+14

Vì vậy, bạn đang đề xuất một công cụ dựa trên "Tôi không chắc chắn những gì bạn cần, nhưng bạn có thể tự mình lập trình bằng Python". Tại sao bạn cần scons sau đó? – jalf

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 for C++

+0

NuGet là một phần mở rộng Visual Studio – Toughy

+0

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

14

Đối với công tác quản lý phụ thuộc, nó tồn tại một dự án mới (nó là một công ty khởi động) được thực hiện loại công cụ: https://www.biicode.com/ (C++ quản lý phụ thuộc). Bạn có thể thêm phụ thuộc của bạn và nó sẽ làm việc.

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

UPDATE: Dự án này là dead ... Thật không may, có vẻ như khởi động không có đủ phí bảo hiểm khách hàng trả tiền, nhưng máy chủ dường như đang làm việc tốt ...

UPDATE2: Có vẻ như có một sự thay thế dự án: conan.io (nhờ @mucaho)

+2

Tuyên bố từ chối trách nhiệm: Tôi làm việc trong biicode. Chúng tôi đang xây dựng một người quản lý phụ thuộc (với các vitamin), đặc biệt là hướng tới C/C++. Nó vẫn đang trong giai đoạn thử nghiệm và chúng tôi đang cải thiện nó nhanh chóng dựa trên phản hồi của người dùng. Chúng tôi dự định phát hành chính trong vòng vài tuần và một số thư viện phổ biến sẽ được tải lên biicode trong vài tháng tới, vì vậy điều gì đó thực sự thú vị đang nổi lên, hãy chờ vài tuần và ghé thăm chúng tôi, bạn sẽ thích nó! – drodri

+0

Nó cũng có kho lưu trữ trung tâm, cộng với nó miễn phí cho phần mềm nguồn mở. – mucaho

+1

@mucaho và nó đã chết, hãy xem http://blog.biicode.com –

-1

Hãy thử SCons

SCons là một xây dựng phần mềm Nguồn công cụ đó là một thế hệ kế tiếp xây dựng công cụ Open. Hãy suy nghĩ về SCons như là một thay thế đa nền tảng được cải thiệ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à cache của trình 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.

+2

SCons không có bất kỳ quản lý phụ thuộc hoặc kho lưu trữ được xây dựng như được hỏi. –

3

Gần đây phát hành: biicode Một công cụ đa nền tảng và dịch vụ lưu trữ cho các nhà phát triển

Edit:

Biicode bị phản

Alternative: Conan.io

+2

Biicode [đã chết] (https://www.reddit.com/r/cpp/comments/3h8o2r/biicode_c_dependency_manager_has_gone_out_of/). Người kế nhiệm có vẻ là [Conan.io] (https://www.reddit.com/r/cpp/comments/3v05s9/conan_a_cc_package_manager/). – mucaho

0

Có một số công cụ ngồi trên đầu trang của SCons, cung cấp chức năng cấp cao hơn tương tự như 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, SCON chính nó có nhược điểm lớn - thời gian biên dịch dài hơn cho các dự án lớn.

Tôi có thể đề nghị dùng thử SNOCS (mà là một SCons đảo ngược) cho những người tìm kiếm một quản lý phụ thuộc dễ dàng và chọn tùy chọn biên dịch trong lệnh đơn (trình biên dịch, x86/x64, Debug/Release, tĩnh/chia sẻ thư viện, mục tiêu kiểm tra/cài đặt, 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 đầu ra cấu hình dự án trong các tệp riêng biệt, cho phép hậu quả xây dựng bỏ qua giai đoạn cấu hình và đi thẳng đến giai đoạn xây dựng (tính năng cuối cùng đang được xây dựng)

Cấu hình của CMake trở nên tẻ nhạt trong một 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 như Martijn đã đề cập có biicode mà "sử dụng CMake để tạo dự án của bạn với phụ thuộc của nó".

2

Tôi khuyên bạn nên 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 phụ thuộc và nhị phân trong dự án của bạn.

Các vấn đề liên quan