2011-07-06 41 views
19

Tôi hiện đang làm việc trên dự án dựa trên C++ Qt lớn sắp sửa đi theo một yếu tố chính của API công khai của nó và sẽ rất tuyệt khi có công cụ có thể tạo báo cáo mà trên đó các phương thức đã được thêm hoặc xóa khỏi bản dựng để xây dựng.Theo dõi thay đổi API công cộng của C++ lib

Tôi biết có một công cụ cho Java để làm điều này và tôi nghĩ rằng có thể có một cho NET. Nhưng tôi không thể, sau một chút tìm kiếm, tìm thấy bất cứ điều gì cho C + +.

Hiện tại có tồn tại không. Nền tảng chéo sẽ tốt đẹp, hoặc nếu chỉ trong Linux cũng sẽ ổn thôi.

+1

Bạn có đang sử dụng bất kỳ công cụ kiểm soát phiên bản nào không? Nó có thể cung cấp một công cụ khác tạo báo cáo xml ... – vrince

+0

Sử dụng Git để kiểm soát phiên bản –

+1

Tôi không làm việc với git nhưng nếu bạn sử dụng những gì được hiển thị trong [bài đăng này] (http://stackoverflow.com/questions/ 822811/khác biệt-trong-git-chi nhánh) trên * tiếp xúc * một phần của bạn API Tôi nghĩ rằng bạn có thể có một báo cáo phong nha về những gì thay đổi giữa hai phiên bản của API của bạn ... – vrince

Trả lời

12

Nếu bạn sử dụng Doxygen hoặc một số công cụ tương tự để ghi lại API của mình thì bạn có thể diff bảng mục lục.

  • Đây là điều bạn nên làm.
    • (Bạn cũng có thể cho Doxygen để tìm chức năng không có giấy tờ.)
  • Bạn có thể áp dụng nó một cách dễ dàng để checkins cổ mà không thay đổi bất cứ điều gì.
  • Doxygen và ilk của nó biết đủ về ngôn ngữ nhạy cảm với privatepublic.
  • Giải pháp này có thể được áp dụng cho nhiều ngôn ngữ và không phụ thuộc vào một IDE cụ thể.
  • Không yêu cầu phần mềm của bên thứ ba (do bạn đã có trình tạo tài liệu).
1

Thêm bước xây dựng tự động sử dụng nm trên các ứng dụng Unix và bất kỳ công cụ Windows nào (dumpbin?) Để kết xuất danh sách các hàm đã xuất. Sử dụng một số ngôn ngữ kịch bản để loại bỏ các bit không quan trọng thay đổi từ xây dựng để xây dựng, như địa chỉ.

Sau mỗi lần xây dựng, hãy cam kết tệp này để kiểm soát phiên bản. Sau đó, bạn có thể thấy sự khác biệt từ mỗi bản dựng.

Vì đây là ứng dụng C++ nên tên cũng sẽ bắt các thay đổi kiểu tham số.

2

Thay vì cho phép tất cả các biểu tượng hiển thị xuất tự động từ thư viện của bạn, bạn có thể sử dụng danh sách rõ ràng các biểu tượng đã xuất. Đối với các thư viện lớn hơn, điều này thậm chí còn được đề xuất.

In Windows you use a .DEF file to export symbols from a DLL.

In Unix-likes you use a linker script to do it.

+0

Ký hiệu đã xuất không quảng cáo cho dù chúng là riêng tư hay công khai. – spraff

+0

@spraff: Có nhưng điều này có liên quan như thế nào? Bởi vì các biểu tượng riêng tư không phải là một phần của API công khai? –

+0

Đó là yêu cầu, vâng. – spraff

0

Nếu bạn sử dụng git bạn nên tạo một chi nhánh mới và sử dụng một kịch bản shell để so sánh tất cả các tập tin tiêu đề xác định API bwetween các chi nhánh. Nếu bạn chưa làm như vậy, bạn nên sử dụng mẫu impl cho các tệp tiêu đề API của bạn để làm cho thư viện nhị phân tương thích/ổn định hơn cho các phiên bản sau. Xem mục nhập cho d_pointer trong wiki nhà phát triển Qt hoặc một phần khoảng D-Pointers trong cơ sở công nghệ KDE.

6

Kiểm tra dưới cùng của danh sách thương mại cho apidiff, tôi nghĩ rằng nó sẽ là trận đấu gần nhất.

Các gợi ý của việc sử dụng 'nm' không phải là một xấu, bạn có thể chạy

nm <binary_or_lib> | c++filt 

Và nó sẽ tạo ra một bản chụp đàng hoàng, mà sẽ cần một số tiền hợp lý của post-processing.

Có rất nhiều cách để cuộn của riêng bạn trên này:

  1. Doxygen có thể tạo ra một tập tin XML có tất cả các thông tin lớp/thành viên/phương pháp mà bạn có thể sau đó tôi cho cây xây dựng lớp. Sau đó nó sẽ là một vấn đề so sánh cây cối. Một số hữu ích sau chế biến scripts/tiện ích có thể được tìm thấy @http://www.stack.nl/~dimitri/doxygen/helpers.html

  2. Nếu bạn đang biên soạn với gcc, egypt là một phương pháp mới, sử dụng các trung gian RTL để sản xuất các đồ thị cuộc gọi phụ thuộc - nó có vẻ như nó sẽ không khó sử dụng phương pháp tương tự để tạo thông tin API cơ bản.

  3. GCC-XML sẽ tạo một biểu diễn XML của mã được biên dịch, cao hơn một chút so với Doxygen vì nó cung cấp cơ chế viết mã trình bao bọc.

  4. cppHeaderParser, mô-đun python sẽ tạo biểu tượng đối tượng python đẹp cho tiêu đề giúp dễ dàng tạo bản đồ API.

  5. ctags tạo cơ sở dữ liệu thẻ có thể được xử lý. Nó có vấn đề với C + + không gian tên mặc dù.

Một số giải pháp thương mại

  1. scitool của Understand làm một công việc tuyệt vời của phần mềm bản đồ ra và có một API perl để truy vấn cơ sở dữ liệu của nó.

  2. MagicDraw là loại công cụ có trọng lượng nặng tập trung vào UML, nhưng nó có thể đảo ngược kỹ sư mã C++ hiện có và tạo siêu thông tin.

  3. apidiff có vẻ là một công cụ khá hợp lý và được cung cấp tiêu chí (đa nền tảng, C++) có khả năng là gần nhất đối sánh.

+0

+1 cho apidiff đề cập đến – celavek

-1

Ngoài tùy chọn sử dụng Doxygen để cuộn công cụ phân tích của riêng mình, tôi cũng khuyên bạn nên xem xét sử dụng BSC Toolkit. Điều này cho phép bạn truy cập thông tin trình duyệt mã/lớp được tạo bởi trình biên dịch MS và có sẵn miễn phí. Bộ công cụ cung cấp khả năng truy cập có lập trình cho tất cả các định nghĩa, tham chiếu sử dụng, số nguồn và số dòng, tham số, công cụ sửa đổi truy cập, vv Tên được cung cấp ở dạng xâu và cơ sở của chúng được bao gồm để dịch chúng sang định dạng có thể đọc được nếu cần.

Dưới đây là một số lượng rất cơ bản từ một dự án tôi đang làm việc trên:

IXConnection (struct_name) 
IXConnection::STATE (enum_name) 
IXConnection::setState(enum STATE) (mem_func public) 
IXConnection::setAccount(struct IXAccount *) (mem_func public) 
IXConnection::setDisplayName(class String *) (mem_func public) 
IXConnection::setProtocolData(void *) (mem_func public) 
IXConnection::getState(enum STATE *) (mem_func public) 
IXConnection::getAccount(struct IXAccount * *) (mem_func public) 
IXConnection::getProtocol(struct IXProtocol * *) (mem_func public) 
IXConnection::getPassword(class String * *) (mem_func public) 
IXConnection::getDisplayName(class String * *) (mem_func public) 
IXConnection::getProtocolData(void * *) (mem_func public) 
IXConnection::setProgress(class String *,int,int) (mem_func public) 
IXConnection::notice(class String *) (mem_func public) 
IXConnection::error(enum REASON,class String *) (mem_func public) 
1

Hãy thử abi-compliance-checker. Công cụ này hiển thị các biểu tượng được thêm/xóa trong API của bạn, thay đổi về tham số/kiểu dữ liệu và các thay đổi khác từ điểm tương thích nhị phân của chế độ xem. Đó là nền tảng chéo.Hiệu suất tốt nhất là trên Linux, nhưng nó có thể chạy trên Windows và Mac.

Cách sử dụng:

abi-compliance-checker -lib NAME -old OLD.abidump -new NEW.abidump 

* .abidump file là ABI bãi tạo ra bởi các công cụ abi-dumper.

compatibility table này cho thư viện Qt được tạo ra sử dụng công cụ này:

enter image description here

Hãy hỏi bất kỳ câu hỏi sử dụng trong các ý kiến ​​dưới đây.

+0

Ngọt ngào! Đó là thứ tôi đang tìm kiếm. Tôi sẽ cho nó đi. –

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