2012-01-08 52 views
6

Tôi có stucture direcory sau:bao gồm các tệp tiêu đề - liên quan đến thư mục hiện tại hoặc để bao gồm các thư mục?

src 
    +-- lib1 
    +-- lib1.h 
    +-- lib2 
    +-- lib2.h 

Cả lib1lib2 đang gonna được phân phối (cài đặt). lib2 tận dụng lib1, vì vậy nó cần một số bao gồm:

#include "../lib1/lib1.h" // 1 
#include "lib1/lib1.h" // 2 
#include <lib1/lib1.h> // 3 

(1) là con đường thẳng về phía trước, nhưng là rất unflexible. (2) là cách tôi sử dụng tại thời điểm này, nhưng hệ thống xây dựng cần phải biết rằng src cần phải được thêm vào đường dẫn bao gồm. (3) có vẻ tốt nhất cho tôi theo khía cạnh phân phối vì sau đó có thể giả định rằng tiêu đề nằm ở vị trí chuẩn, nhưng không quá rõ ràng đối với tôi cách hệ thống xây dựng xử lý (trong trường hợp này, lib1 cần phải được cài đặt trước lib2 có thể được biên dịch).

Cách được khuyến nghị là gì?

+0

Bạn có ý nghĩa gì khi "cài đặt" một lib? Đây có phải là thư viện tĩnh hoặc động không? Nếu nó là tĩnh thì chỉ cần tạo một cấu trúc kho đẹp và thêm các thư mục này vào đường dẫn include của bạn. –

+0

Đây là tất cả việc triển khai cụ thể. Một số hệ thống thậm chí không có thư mục! –

+0

@EdS., Ý tôi là: Các tập tin header và libs được sao chép ở đâu đó (vị trí chuẩn, '/ usr/local/{lib, include}') để có thể sử dụng chúng trong các dự án khác. –

Trả lời

9

Sự khác biệt duy nhất giữa ""<> hình thức bao gồm là các "" hình thức tìm kiếm đầu tiên ở một số nơi và sau đó dự phòng đến những nơi tương tự như <>. Tập hợp các địa điểm bổ sung là phụ thuộc triển khai thực hiện và thư mục chung duy nhất là thư mục chứa tệp chứa chỉ thị bao gồm. Các tùy chọn trình biên dịch thêm vào đường dẫn bao gồm thường thêm vào biểu mẫu <> và do đó các thư mục đó được tìm kiếm cho cả hai biểu mẫu.

Vì vậy, lựa chọn giữa hai biểu mẫu chủ yếu là một kiểu. Sử dụng biểu mẫu "" cho dự án hiện tại và <> cho thư viện hệ thống là phổ biến. Đối với những thứ ở giữa, thực hiện một sự lựa chọn và dính vào nó trong dự án của bạn.

+0

Từ điểm của 'lib2': Không có sự khác biệt giữa' lib1/lib1.h' và ví dụ: 'boost/shared_ptr.hpp' ngoại trừ việc chúng được viết bởi cùng một lập trình viên và cư trú trong các thư mục anh chị em (bởi vì chúng" chủ yếu là làm việc cùng nhau ", nhưng cũng có thể được sử dụng độc lập bởi các đồng nghiệp khác). Nhưng trong trường hợp của tôi, tôi sẽ sử dụng cái đầu tiên với '" "' và cái còn lại có '<>'. 1 cho chỉ ra rằng các đường dẫn bao gồm luôn luôn được sử dụng như một dự phòng và vấn đề là một thẩm mỹ hơn. –

2

Tôi bỏ phiếu cho phiên bản 2.

#include "../lib1/lib1.h" // 1 

này giả định cây sẽ luôn giữ nguyên. Vì vậy, khi bạn thay đổi cấu trúc của mình, bạn sẽ cần phải sửa đổi cấu trúc này ở mọi nơi.

#include "lib1/lib1.h" // 2 

Tôi không thấy vấn đề thêm src vào đường dẫn bao gồm là gì. Trên thực tế, bạn thậm chí không cần phải thêm src để con đường bao gồm, bạn có thể trực tiếp thêm src/lib1 và chỉ có #include "lib1.h"

#include <lib1/lib1.h> // 3 

phong cách này bao gồm được sử dụng cho tiêu đề hệ thống. Bạn nên tránh điều này, vì hầu hết các lập trình viên được sử dụng để xem windows.h hoặc string hoặc vector bên trong <>. Bạn cũng đang nói cho trình biên dịch tìm kiếm đầu tiên trong các thư mục mặc định thay vì thư mục của riêng bạn. Tôi sẽ tránh cái này.

Side lưu ý:

Bạn nên suy nghĩ về một cấu trúc như thế này:

src 
    +-- lib1 
    +-- lib1.h 
    +-- lib2 
    +-- lib2.h 
include 

nơi thư mục chứa tất cả include công khai tiêu đề có thể nhìn thấy. Nếu lib1.h là công khai, hãy di chuyển đến đó. Nếu không, cấu trúc bạn hiện có sẽ ổn.

+0

Tại sao lại là downvote? –

+0

Tôi nghĩ rằng bạn đã sai với '#include" lib1.h "', như tôi đã nói, cả hai libs nên được cài đặt và có thể sử dụng được bởi các dự án khác. Vì vậy, bao gồm 'lib1/lib1.h' thay vì đơn giản' lib1.h' có lợi thế là nó có thể được sử dụng trong các dự án khác mà không chỉ định đường dẫn khác bao gồm đường dẫn mặc định. Nhưng nó không phải là downvote của tôi, btw :) –

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