2011-09-08 42 views
8

Chúng tôi đang trong quá trình thiết kế một thư viện C++ mới và quyết định đi với một phương pháp tiếp cận dựa trên mẫu cùng với một số chuyên môn mẫu từng phần cụ thể cho các trường hợp góc. Cụ thể, đây sẽ là một thư viện mẫu chỉ tiêu đề tiêu đề.Biên dịch thư viện mẫu tiêu đề chỉ thành một thư viện được chia sẻ?

Bây giờ, có một số lo ngại rằng điều này sẽ dẫn đến rất nhiều trùng lặp mã trong mã nhị phân, vì thư viện mẫu này sẽ được biên dịch vào bất kỳ thư viện hoặc tệp thực thi nào khác. được sử dụng). Tôi vẫn nghĩ rằng đây không phải là một vấn đề (đặc biệt, trình biên dịch thậm chí có thể nội tuyến những thứ mà nó không thể vượt qua ranh giới thư viện được chia sẻ).

Tuy nhiên, vì chúng ta biết tập hợp các loại hữu hạn này sẽ được sử dụng, có cách nào để biên dịch tiêu đề này thành thư viện và cung cấp tiêu đề khác chỉ với khai báo và không có gì khác? Lưu ý rằng thư viện không chỉ chứa các triển khai chung mà còn là các chuyên môn từng phần.

+0

Bạn có nghĩa là "hữu hạn" hoặc "bị chặn" không? Rõ ràng bất cứ điều gì bạn làm trên một máy tính, hoặc trong vũ trụ này, sẽ là hữu hạn, vì vậy sự khác biệt là rất quan trọng. –

+0

Tôi có nghĩa là bị chặn: chúng tôi sẽ cần các phiên bản của các mẫu này trong khoảng 8 loại và không còn nữa. Vì vậy, chúng tôi có thể dễ dàng viết ra một danh sách. – lytenyn

+0

Hmm, tôi không hoàn toàn chắc chắn, và bạn chắc chắn sẽ phải gửi các tiêu đề thực tế, nhưng bạn có thể thêm các instantiations rõ ràng cho các loại đó vào một tệp nguồn và biên dịch nó và khai báo các mẫu đó ở bất kỳ đâu. Tôi chưa bao giờ thử điều này, nhưng tôi nghĩ điều này được cho là có hiệu quả mong muốn. –

Trả lời

6

Có. Những gì bạn có thể làm là khởi tạo một cách rõ ràng các khuôn mẫu trong các tệp CPP bằng cách sử dụng cú pháp khởi tạo khuôn mẫu rõ ràng của trình biên dịch. Đây là cách sử dụng instantiation rõ ràng trong VC++: http://msdn.microsoft.com/en-us/library/by56e477(v=VS.100).aspx. G ++ có tính năng tương tự: http://gcc.gnu.org/onlinedocs/gcc/Template-Instantiation.html#Template-Instantiation.

Lưu ý rằng C++ 11 giới thiệu một cú pháp tiêu chuẩn cho instantiation rõ ràng, được mô tả trong [14.7.2] instantiation Explicit của FDI:

Cú pháp cho instantiation rõ ràng là:

rõ ràng-instantiation:

externopttemplatekhai

+1

Cảm ơn bạn, bài đăng này cũng rất hữu ích: http://anteru.net/2008/11/19/318/ – lytenyn

1

Nếu nó thực sự là mẫu, thì không có thư viện được chia sẻ. Xem các dự án Boost khác nhau cho các ví dụ cụ thể. Chỉ khi bạn có mã không phải mẫu, bạn sẽ có một thư viện. Ví dụ cụ thể là ví dụ: Boost Date_Time và định dạng ngày và phân tích cú pháp; bạn có thể sử dụng thư viện có hoặc không có tính năng đó và do đó có hoặc không có liên kết.

Không có thư viện được chia sẻ nào tốt cho cảm giác có ít phụ thuộc hơn. Nhược điểm là các tệp nhị phân của bạn có thể lớn hơn một chút và bạn có chi phí thời gian biên dịch cao hơn một chút. Nhưng dung lượng lưu trữ khá rẻ (trừ khi bạn làm việc trong các hệ thống nhúng là các trường hợp đặc biệt khác) và việc biên dịch thường là chi phí cố định một lần.

3

C++ Shared Library with Templates: Undefined symbols error Một số câu trả lời bao gồm chủ đề này. Tóm lại: có thể nếu bạn buộc phải tạo nhanh các mẫu trong mã thư viện được chia sẻ một cách rõ ràng. Nó sẽ yêu cầu đặc tả rõ ràng cho tất cả các loại được sử dụng cho tất cả các mẫu được sử dụng trên bên lib được chia sẻ, mặc dù.

0

Mặc dù không phải là một cách tiêu chuẩn để làm điều đó, nó thường được dùng với các kỹ thuật cụ thể thực hiện. Tôi đã làm nó từ lâu với Bor ++'s C++ Builder. Ý tưởng là để khai báo các mẫu của bạn được xuất khẩu từ thư viện được chia sẻ, nơi chúng cần phải cư trú và nhập chúng vào nơi chúng được sử dụng.Cách tôi thực hiện theo các dòng sau:

// A.h 
#ifdef GENERATE 
# define DECL __declspec(dllexport) 
#else 
# define DECL __declspec(dllimport) 
#endif 

template <typename T> class DECL C { 
}; 

// A.cpp 
#define GENERATE 
#include "A.h" 

template class DECL A<int>; 

Hãy coi chừng tôi không có quyền truy cập vào mã gốc, vì vậy có thể có lỗi. This blog entry mô tả cách tiếp cận rất giống nhau.

Từ từ ngữ của bạn, tôi nghi ngờ bạn không có trên Windows, vì vậy bạn sẽ phải tìm hiểu xem cách tiếp cận này có thể được áp dụng với trình biên dịch của bạn hay không. Tôi hy vọng điều này là đủ để đưa bạn đi đúng hướng.

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