Cấu trúc thư mục cho thư viện C ++


81

Tôi đang làm việc trên một thư viện C ++. Cuối cùng, tôi muốn công khai nó cho nhiều nền tảng (ít nhất là Linux và Windows), cùng với một số ví dụ và các ràng buộc Python . Công việc đang tiến triển tốt đẹp, nhưng hiện tại thì dự án khá lộn xộn, chỉ được xây dựng trong và cho Visual C ++ chứ không phải đa nền tảng.

Do đó, tôi cảm thấy một cuộc dọn dẹp đang diễn ra. Điều đầu tiên tôi muốn cải thiện là cấu trúc thư mục của dự án. Tôi muốn tạo một cấu trúc phù hợp với các công cụ Automake để cho phép biên dịch dễ dàng trên nhiều nền tảng, nhưng tôi chưa bao giờ sử dụng chúng trước đây. Vì tôi vẫn đang làm (hầu hết) viết mã trong Visual Studio, tôi cũng cần một nơi nào đó để giữ các tệp giải pháp và dự án Visual Studio của mình.

Tôi đã cố gắng google để tìm các thuật ngữ như "cấu trúc thư mục thư viện C ++", nhưng dường như không có gì hữu ích xuất hiện. Tôi đã tìm thấy một số hướng dẫn rất cơ bản, nhưng không có giải pháp rõ ràng.

Trong khi xem xét một số thư viện mã nguồn mở, tôi đã nghĩ ra những điều sau:

\mylib
    \mylib <source files, read somewhere to avoid 'src' directory>
        \include? or just mix .cpp and .h
    \bin <compiled examples, where to put the sources?>
    \python <Python bindings stuff>
    \lib <compiled library>
    \projects <VC++ project files, .sln goes in project root?>
    \include? 
    README
    AUTHORS
    ...

Tôi không có / ít kinh nghiệm trước đây với các dự án mã nguồn mở / phát triển đa nền tảng và khá ngạc nhiên rằng tôi không thể tìm thấy bất kỳ hướng dẫn tốt nào về cách cấu trúc một dự án như vậy.

Nói chung nên cấu trúc một dự án thư viện như thế nào? Nên đọc gì? Có một số ví dụ điển hình?


Câu trả lời:


105

Một điều rất phổ biến giữa các thư viện Unix là chúng được tổ chức như vậy:

./         Makefile and configure scripts.
./src      General sources
./include  Header files that expose the public interface and are to be installed
./lib      Library build directory
./bin      Tools build directory
./tools    Tools sources
./test     Test suites that should be run during a `make test`

Nó phần nào phản ánh hệ thống tệp Unix truyền thống dưới /usrđây:

/usr/src      Sometimes contains sources for installed programs
/usr/include  Default include directory
/usr/lib      Standard library install path
/usr/share/projectname   Contains files specific to the project.

Tất nhiên, chúng có thể kết thúc bằng /usr/local(là tiền tố cài đặt mặc định cho GNU autoconf) và chúng có thể không tuân thủ cấu trúc này.

Không có quy tắc khó và nhanh. Cá nhân tôi không sắp xếp mọi thứ theo cách này. (Tôi tránh sử dụng một ./src/thư mục nào đó, ngoại trừ các dự án lớn nhất, chẳng hạn. Tôi cũng không sử dụng công cụ tự động, thay vào đó là CMake.)

Đề xuất của tôi cho bạn là bạn nên chọn một bố cục thư mục có ý nghĩa cho bạn (và nhóm của bạn). Làm bất cứ điều gì hợp lý nhất cho môi trường phát triển bạn đã chọn, xây dựng công cụ và kiểm soát nguồn.


3
Khi sử dụng CMake, bản dựng ngoài nguồn có vẻ tuyệt vời.
Korchkidu

12

Có một quy ước tuyệt vời này mà tôi đã xem gần đây có thể hữu ích: Bố cục Pitchfork (cũng trên GitHub ).

Tóm lại, tiểu mục 1.3 nói rằng:

PFL quy định một số thư mục sẽ xuất hiện ở gốc của cây dự án. Không phải tất cả các thư mục đều được yêu cầu, nhưng chúng có mục đích được chỉ định và không thư mục nào khác trong hệ thống tệp có thể đảm nhận vai trò của một trong các thư mục này. Có nghĩa là, những thư mục này phải là những thư mục được sử dụng nếu mục đích của chúng được yêu cầu.

Các thư mục khác không được xuất hiện ở thư mục gốc.

build/: Một thư mục đặc biệt không nên được coi là một phần của nguồn của dự án. Được sử dụng để lưu trữ kết quả xây dựng tạm thời. không được đưa vào kiểm soát nguồn. Nếu sử dụng kiểm soát nguồn, phải được bỏ qua bằng cách sử dụng danh sách bỏ qua kiểm soát nguồn.

src/: Vị trí nguồn có thể tổng hợp chính. Phải có mặt cho các dự án có các thành phần được biên dịch không sử dụng mô-đun con. Với sự hiện diện của include/, cũng chứa các tiêu đề riêng.

include/: Thư mục cho tiêu đề công khai. Có thể có mặt. Có thể bị bỏ qua đối với các dự án không phân biệt tiêu đề riêng / công cộng. Có thể bị bỏ qua đối với các dự án sử dụng mô-đun con.

tests/: Thư mục cho các bài kiểm tra.

examples/: Thư mục mẫu và ví dụ.

external/: Thư mục cho các gói / dự án được dự án sử dụng, nhưng không được chỉnh sửa như một phần của dự án.

extras/: Thư mục chứa các mô-đun con bổ sung / tùy chọn cho dự án.

data/: Thư mục chứa các khía cạnh không phải mã nguồn của dự án. Điều này có thể bao gồm đồ họa và tệp đánh dấu.

tools/: Thư mục chứa các tiện ích phát triển, chẳng hạn như tập lệnh xây dựng và cấu trúc lại

docs/: Thư mục tài liệu dự án.

libs/: Thư mục cho các mô-đun con của dự án chính.

Ngoài ra, tôi nghĩ rằng extras/thư mục là nơi các liên kết Python của bạn sẽ đi đến .


4

Tôi không nghĩ rằng thực sự có bất kỳ hướng dẫn tốt nào cho việc này. Hầu hết đó chỉ là sở thích cá nhân. Tuy nhiên, một số IDE nhất định sẽ xác định cấu trúc cơ bản cho bạn. Visual Studio, chẳng hạn, sẽ tạo một thư mục bin riêng biệt được chia trong một thư mục con Gỡ lỗi và Phát hành. Trong VS, điều này có ý nghĩa khi bạn đang biên dịch mã của mình bằng các mục tiêu khác nhau. (Chế độ gỡ lỗi, Chế độ phát hành.)

Như greyfade nói, hãy sử dụng bố cục phù hợp với bạn. Nếu người khác không thích nó, họ sẽ phải tự cơ cấu lại nó. May mắn thay, hầu hết người dùng sẽ hài lòng với cấu trúc bạn đã chọn. (Trừ khi nó thực sự lộn xộn.)


4

Tôi thấy thư viện wxWidgets (mã nguồn mở) là một ví dụ điển hình. Chúng hỗ trợ nhiều nền tảng khác nhau (Win32, Mac OS X, Linux, FreeBSD, Solaris, WinCE ...) và trình biên dịch (MSVC, GCC, CodeWarrior, Watcom, v.v.). Bạn có thể xem cách bố trí cây tại đây:

https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk/


-1

Tôi thực sự có thể khuyên bạn sử dụng CMake ... nó để phát triển nền tảng chéo và linh hoạt hơn nhiều khi tự động hóa, sử dụng CMake và bạn sẽ có thể viết mã nền tảng chéo với cấu trúc chỉ thị của riêng bạn trên tất cả các hệ thống.

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.