2010-08-31 28 views
8

Có an toàn khi sử dụng một STL tuân thủ tiêu chuẩn trong thư viện và một STL khác trong dự án sử dụng thư viện đó không? Ví dụ:Sử dụng STL trong thư viện nguồn đóng

//library.h 

#include <string> //let's say here it uses minGW STL 

void Foo(std::string& str_mingw); 

//library.cpp 
void Foo(std::string& str_mingw) { /*do something*/ } 



//application.cpp 

#include "library.h" 
#include <string> //let's say here it uses VStudio STL 

void Bar() 
{ 
    std::string str_vstudio; 
    Foo(str_vstudio); 
    //Foo() inside the .lib or .dll uses string from minGW, 
    //but here a string from VStudio is used 
} 

Dường như với tôi rằng những điều xấu sẽ xảy ra, đặc biệt nếu những gì được sử dụng không phải là chuỗi đơn giản nhưng phức tạp hơn như tr2 :: thread. Nhưng nếu vậy, làm thế nào tôi có thể biên dịch một thư viện trong một trình biên dịch và để cho người dùng thư viện tự do lựa chọn trình biên dịch ưa thích của họ cho các dự án của họ?

+0

Windows/MinWG n00b hỏi: tại sao bạn không thể sử dụng VS STL với MinGW? – Dummy00001

+4

Không nên tiêu đề thực sự giống như "sử dụng nhiều thư viện chuẩn trong một dự án duy nhất"? Đóng nguồn không có vẻ liên quan đến câu hỏi thực tế đang được hỏi. –

+0

@Mark B Tôi đã chỉ định "nguồn đóng" vì một thư viện nguồn mở có thể được biên dịch bởi khách hàng với bất kỳ STL nào họ thích, vì vậy chắc chắn không có vấn đề gì. – user418680

Trả lời

6

Nếu - theo thư viện - bạn có nghĩa là thư viện động - Câu trả lời đơn giản là: không và câu trả lời phức tạp là: không.

C++ và thư viện động là một viễn cảnh rất dễ vỡ. Bất kỳ thay đổi nhỏ nào cũng đòi hỏi phải xây dựng lại tất cả các mô-đun và thời gian chạy được sử dụng bởi mỗi thư viện PHẢI là thể hiện chính xác của thư viện.

Thậm chí nếu bạn quản lý để có được một chuỗi :: std trên một ranh giới dll - trong khi giao diện bên ngoài của std :: string là cố định, bất kỳ sự khác biệt thực hiện sẽ làm cho dữ liệu xuất hiện bị hỏng. Nó chỉ an toàn để truyền các cấu trúc POD đơn giản và các kiểu dữ liệu tự nhiên giữa các thư viện động nếu các thời gian chạy có khả năng khác nhau - và thậm chí chăm sóc phải được thực hiện để quản lý chính xác tuổi thọ của đối tượng - thư viện phân bổ PHẢI là thư viện phân bổ .

Nếu bạn ngụ ý thư viện tĩnh - điều đó không có ý nghĩa lớn - tôi không nghĩ rằng libs do MinGW thực hiện sẽ tương thích với MSDev và MSDev libs không tương thích với MinGW. Ngay cả khi định dạng tệp lib tương thích với danh nghĩa - giả sử các tên gọi khác nhau không gây ra sự ngăn chặn thành công: thư viện STL của môi trường liên kết cuối cùng sẽ được sử dụng.

4

Tùy thuộc vào thư viện, nền tảng và cách bạn biên dịch và liên kết nó. Các thư viện thường (đặc biệt trên Windows) được phân phối dưới dạng các tệp DLL và có các quy tắc rất cụ thể về những gì có thể nằm trên các ranh giới và cách mỗi cần được biên dịch.

Boost, ví dụ, xây dựng DLL cho:

  • đơn hoặc đa luồng
  • gỡ lỗi hoặc phát hành
  • tĩnh (lib) hoặc động (DLL)
  • cho mỗi trình biên dịch khác nhau và phiên bản

Xem http://beta.boost.org/doc/libs/1_36_0/more/getting_started/windows.html#library-naming cho các hoán vị.

Vì vậy, có, đó là một vấn đề lớn.

+1

và không đặt bất kỳ cái nào trong số chúng trong WinSxS. Xấu! –

6

Có an toàn khi sử dụng một STL tuân thủ tiêu chuẩn trong thư viện và một khác trong dự án sử dụng thư viện đó không?

số

Một số phần của STL cho việc tái sử dụng được đưa vào một thư viện chia sẻ. Không thể đảm bảo rằng cấu trúc bên trong của các lớp sẽ khớp với nhau trong các STL khác nhau, do đó dẫn đến các sự cố không thường xuyên nếu cả hai được sử dụng bởi một chương trình thay thế lẫn nhau.

Cũng lưu ý rằng STL từ các nhà cung cấp khác nhau có thể có tổ chức không gian tên và lớp nội bộ khác nhau. Điều đó có hiệu lực mà biểu tượng công khai std::basic_string có thể có tên nội bộ khác nhau và sẽ bị xáo trộn khác nhau, làm cho void Foo(std::string& str_mingw);void Foo(std::string& str_vstudio); từ phối cảnh liên kết hai chức năng khác nhau.

1

Có an toàn để sử dụng một tiêu chuẩn STL phù hợp trong thư viện, và nhau trong một dự án có sử dụng rằng thư viện? ... void Foo(std::string& str_mingw); ... Foo(str_vstudio);

No. Nó thậm chí không có nhiều việc phải làm với thư viện động. Thậm chí nếu bạn quản lý bằng cách nào đó liên kết cả chuỗi MS std :: string và chuỗi MinGW std :: vào cùng một tệp thực thi, nó vẫn sẽ bị ngắt. Bạn có hai định nghĩa riêng biệt (có khả năng khác nhau) của std :: string trong chương trình của bạn và nếu bạn trộn chúng, bạn đang ở trong vùng hành vi không xác định.

Tuy nhiên, lưu ý rằng nó sẽ hoạt động nếu chuỗi std :: của bạn không được sử dụng trong giao diện. Tức là: bạn có thể có một thư viện sử dụng các chuỗi MinGW trong nội bộ và một lib khác sử dụng các chuỗi VC bên trong miễn là bạn sử dụng const char * (làm ví dụ) ở cấp độ giao diện.

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