visual c ++: #include tệp từ các dự án khác trong cùng một giải pháp


113

Tôi đang làm việc trên một trò chơi bằng Visual C ++. Tôi có một số thành phần trong các dự án riêng biệt và đã thiết lập các phụ thuộc của dự án. Làm cách nào để # bao gồm tệp tiêu đề khỏi một dự án khác? Tôi không biết làm thế nào để sử dụng các lớp từ dự án này trong dự án khác.

Câu trả lời:


199

Cài đặt cho trình biên dịch

Trong dự án mà bạn muốn #include tệp tiêu đề từ một dự án khác , bạn sẽ cần thêm đường dẫn của tệp tiêu đề vào phần Thư mục Bao gồm Bổ sung trong cấu hình dự án.

Để truy cập cấu hình dự án:

  1. Nhấp chuột phải vào dự án và chọn Thuộc tính.
  2. Chọn Thuộc tính cấu hình-> C / C ++ -> Chung.
  3. Đặt đường dẫn trong Thư mục Bao gồm Bổ sung.

Làm thế nào để bao gồm

Để bao gồm tệp tiêu đề , chỉ cần viết như sau vào mã của bạn:

#include "filename.h"

Lưu ý rằng bạn không cần chỉ định đường dẫn ở đây, vì bạn đã bao gồm thư mục trong Thư mục Bao gồm Bổ sung rồi, vì vậy Visual Studio sẽ biết nơi cần tìm.

Nếu bạn không muốn thêm mọi vị trí tệp tiêu đề trong cài đặt dự án, bạn chỉ có thể bao gồm một thư mục cho đến một điểm và sau đó #include liên quan đến điểm đó:

// In project settings
Additional Include Directories    ..\..\libroot

// In code
#include "lib1/lib1.h"    // path is relative to libroot
#include "lib2/lib2.h"    // path is relative to libroot

Cài đặt cho trình liên kết

Nếu sử dụng thư viện tĩnh (tức là tệp .lib), bạn cũng sẽ cần thêm thư viện vào đầu vào của trình liên kết, để tại thời điểm liên kết, các ký hiệu có thể được liên kết với nhau (nếu không bạn sẽ nhận được một ký hiệu chưa được giải quyết):

  1. Nhấp chuột phải vào dự án và chọn Thuộc tính.
  2. Chọn Thuộc tính cấu hình-> Trình liên kết-> Đầu vào
  3. Nhập thư viện trong Phụ thuộc bổ sung.

6
Tôi chỉ có thể nói rằng sau một buổi sáng đọc câu trả lời về chủ đề này trên SO, câu trả lời của bạn rõ ràng và toàn diện nhất mà tôi đã xem qua. Làm tốt và cảm ơn!
David Hall

9
Có một đề xuất từ ​​người dùng ẩn danh là, "Khi bạn bao gồm Đường dẫn cho thư viện, hãy đảm bảo bạn nhập chúng trong dấu ngoặc kép nếu đường dẫn có khoảng trắng". Thêm nó dưới dạng bình luận, nếu nó giúp đỡ bất cứ ai.
iDev 14/11/12

2
Một cách bổ sung để bao gồm thư viện tĩnh, trong "các phụ thuộc dự án" của giải pháp, định cấu hình dự án thành một phụ thuộc của thư viện tĩnh được liên kết tới. và cái kia thì không - đây là lý do tại sao.
Stuart Wood

3
Tôi muốn chỉ ra rằng sử dụng "Thư mục Bao gồm Bổ sung" với thư mục tệp nguồn của dự án khác có thể là một ý tưởng tồi. Dự án khác có thể có các tệp có cùng tên (rất có thể nếu bạn đang sử dụng các tiêu đề được biên dịch trước cho từng tệp). Cá nhân, tôi thích để thêm thư mục mẹ của các tập tin nguồn dự án, vì vậy bạn ít nhất có thể xác định chính mình, ví dụ #include "proj2\include.h". Có nhiều dự án cho mỗi giải pháp dường như rất hướng đến các ngôn ngữ NET, vì chúng được sử dụng rất khác nhau. Tuy nhiên, để tìm ra một cách tuyệt vời để khắc phục điều này cho các dự án C ++.
Deji

18
Điều này là một chút kém chất lượng. VS có thể tự động làm rất nhiều. Thật khó tin là không có giải pháp nào tốt hơn so với việc viết mã cứng đường dẫn - cài đặt phụ thuộc dự án hoặc những thứ tương tự có thể tốt.
Cookie

4

#includekhông liên quan gì đến các dự án - nó chỉ nói với bộ tiền xử lý "đặt nội dung của tệp tiêu đề ở đây". Nếu bạn cung cấp cho nó một đường dẫn trỏ đến đúng vị trí (có thể là một đường dẫn tương đối, như ../your_file.h), nó sẽ được đưa vào một cách chính xác.

Tuy nhiên, bạn sẽ phải tìm hiểu về các thư viện (thư viện tĩnh / động) để làm cho các dự án như vậy liên kết đúng cách - nhưng đó là một câu hỏi khác.


3

Vì cả hai dự án đều thuộc cùng một giải pháp, nên có một cách đơn giản hơn cho tệp bao gồm và trình liên kết như được mô tả trong https://docs.microsoft.com/en-us/cpp/build/adding-references-in-visual-cpp- các dự án? view = vs-2019 :

  1. Bao gồm có thể được viết trong một đường dẫn tương đối (Ví dụ #include "../libProject/libHeader.h":).
  2. Đối với trình liên kết, nhấp chuột phải vào "Tài liệu tham khảo", Nhấp vào Thêm tài liệu tham khảo và chọn dự án khác.

Đẹp và đơn giản, nhưng quá tệ là cần có đường dẫn tương đối ở mọi nơi bạn đưa tiêu đề vào.
yoyo

2

Bạn cần đặt đường dẫn đến tiêu đề trong thuộc tính dự án để trình biên dịch tìm ở đó khi cố gắng tìm (các) tệp tiêu đề. Tôi không thể nhớ chính xác vị trí, nhưng hãy xem các thuộc tính của Dự án và bạn sẽ thấy nó.


Vị trí có thể nằm trong Thuộc tính> C / C ++> Chung> Thư mục Bao gồm Bổ sung.
Mustafa Kemal

0

Cố gắng tránh các tham chiếu đường dẫn hoàn chỉnh trong chỉ thị #include, cho dù chúng là tuyệt đối hay tương đối. Thay vào đó, hãy thêm vị trí của thư mục bao gồm của dự án khác trong cài đặt dự án của bạn. Chỉ sử dụng các thư mục con trong tham chiếu đường dẫn khi cần thiết. Bằng cách đó, bạn sẽ dễ dàng di chuyển mọi thứ hơn mà không cần phải cập nhật mã của mình.


0

Mở rộng câu trả lời của @ Benav, cách tiếp cận ưa thích của tôi là:

  1. Thêm thư mục giải pháp vào đường dẫn bao gồm của bạn:
    • nhấp chuột phải vào dự án của bạn trong Trình khám phá giải pháp
    • chọn Thuộc tính
    • chọn Tất cả cấu hình và Tất cả nền tảng từ menu thả xuống
    • chọn C / C ++> Chung
    • thêm $(SolutionDir)vào Thư mục Bao gồm Bổ sung
  2. Thêm tham chiếu vào từng dự án bạn muốn sử dụng:
    • nhấp chuột phải vào Tham chiếu dự án của bạn trong Trình khám phá Giải pháp
    • chọn Thêm tham chiếu ...
    • chọn (các) dự án bạn muốn tham khảo

Bây giờ bạn có thể bao gồm các tiêu đề từ các dự án được tham chiếu của mình như vậy:

#include "OtherProject/Header.h"

Ghi chú:

  • Điều này giả định rằng tệp giải pháp của bạn được lưu trữ một thư mục từ mỗi dự án của bạn, đây là tổ chức mặc định khi tạo dự án với Visual Studio.
  • Bây giờ bạn có thể bao gồm bất kỳ tệp nào từ một đường dẫn liên quan đến thư mục giải pháp, điều này có thể không mong muốn nhưng vì sự đơn giản của cách tiếp cận, tôi đồng ý với điều này.
  • Bước 2 không cần thiết đối với #includes, nhưng nó thiết lập các phụ thuộc xây dựng chính xác mà bạn có thể muốn.
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.