Tôi có một tập tin có chứa những điều sau đây:Ẩn mẫu thuyết minh trong thư viện chia sẻ tạo với g ++
#include <map>
class A {};
void doSomething() {
std::map<int, A> m;
}
Khi biên dịch vào một thư viện chia sẻ với g ++, thư viện chứa ký tự động cho tất cả các phương pháp std::map<int, A>
. Vì A
là riêng tư đối với tệp này, không có khả năng nào std::map
sẽ được khởi tạo trong bất kỳ thư viện được chia sẻ nào khác có cùng thông số, vì vậy tôi muốn ẩn bản mẫu (vì một số lý do được mô tả trong this document).
tôi nghĩ rằng tôi sẽ có thể làm điều này bằng cách thêm một instantiation rõ ràng của lớp mẫu và đánh dấu nó như ẩn, như vậy:
#include <map>
class A {};
template class __attribute__((visibility ("hidden"))) std::map<int, A>;
void doSomething() {
std::map<int, A> m;
}
Tuy nhiên, điều này không có hiệu lực: những biểu tượng vẫn là tất cả đã xuất. Tôi cũng đã cố gắng bao quanh toàn bộ tập tin với:
#pragma GCC visibility push(hidden)
...
#pragma GCC visibility pop
nhưng điều này cũng không ảnh hưởng đến tầm nhìn của các phương pháp std::map<int, A>
(mặc dù nó ẩn doSomething
). Tương tự, biên dịch với -fvisibility=hidden
không ảnh hưởng đến khả năng hiển thị của các phương thức của std::map<int, A>
.
Tài liệu tôi liên kết ở trên mô tả việc sử dụng bản đồ xuất để hạn chế khả năng hiển thị, nhưng điều đó có vẻ rất tẻ nhạt.
Có cách nào để làm những gì tôi muốn trong g ++ (trừ việc sử dụng bản đồ xuất) không? Nếu vậy, nó là cái gì? Nếu không, có một lý do chính đáng tại sao những biểu tượng này phải luôn được xuất khẩu, hay đây chỉ là một thiếu sót trong g ++?
Làm thế nào để bạn nhìn thấy các biểu tượng này? 'nm -g your_lib.so'? Tôi có nghĩa là tôi đã làm thử nghiệm tương tự và thấy rằng 'doSomething' hoặc có thẻ' T' hoặc ẩn khi tôi nói 'fvisibility = hidden' nhưng std :: biểu tượng bản đồ có thẻ' W' luôn. Và tài liệu nói: 'Các định nghĩa yếu chỉ đóng vai trò trong liên kết tĩnh'. Bạn đang sử dụng thư viện của mình theo cách nào? –
Tôi đã sử dụng 'readelf -p .dynstr foo.so'. Cảm ơn bạn đã chỉ ra rằng đây là những biểu tượng yếu. Googling cho "mẫu biểu tượng yếu" đã tạo ra một số kết quả thú vị, chẳng hạn như kết quả này: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=36022, điều mà tôi không hiểu hoàn toàn, nhưng có vẻ như nó có thể liên quan chặt chẽ. – jchl
Cách giải thích của tôi về văn bản trong tài liệu là thực tế là biểu tượng yếu chỉ liên quan đến liên kết tĩnh, không phải là các ký hiệu yếu chỉ được sử dụng để liên kết tĩnh. – jchl