2011-11-03 30 views
5

Tôi có một thư viện dùng chung chỉ được xuất khẩu một chức năng được đánh dấu bằng __attribute__ ((visibility ("default"))). Nó cũng liên kết với một thư viện tĩnh (fftw), vàmingw -fvisibility = hidden dường như không hoạt động

#include<fftw3.h> 

được bắt đầu bằng:

#pragma GCC visibility push(hidden) 

Lệnh mối liên kết sử dụng:

g++.exe -fvisibility=hidden -shared -o mylib.dll -Wl,--out-implib,mylib.dll.a -Wl,--no-whole-archive libfftw3.a libfftw3_omp.a -lgomp 

Bây giờ thư viện kết quả là rất lớn và nếu Tôi kiểm tra các chức năng xuất khẩu nó bao gồm tất cả chức năng fftw, và tất cả các chức năng từ các tập tin của tôi. Dường như mingw bỏ qua các tùy chọn hiển thị. Tôi đọc rằng trước đây nó đã cảnh báo về -fvisibility, nhưng bây giờ nó biên dịch không có cảnh báo nào.

Hiện mingw và gcc 4.6.1 có hỗ trợ cờ hiển thị không? Nếu có, làm cách nào để loại bỏ tất cả nội dung không cần thiết trong thư viện được chia sẻ của tôi?

Trả lời

1

Tệp đối tượng Windows PE không có thuộc tính hiển thị. Gần nhất là dllexport/dllimport, nhưng nó chỉ dành cho các thư viện chia sẻ (DLL). Vì vậy, hoặc là bạn không đánh dấu tất cả các chức năng FFTW với __declspec(dllexport) và hy vọng việc liên kết thư viện tĩnh sẽ thực hiện The Right Thing (tm) hoặc bạn cẩn thận không liên kết đến FFTW nếu liên kết với thư viện của bạn.

Cần cảnh báo về các thuộc tính hiển thị không tốt, có lẽ bạn cần phải bật cấp cảnh báo -Wall -Wextra -pedantic).

4

Mingw là một cổng Windows của GCC toolchain nhưng Windows dll không phải là Linux so. Đặc biệt là the link part is different. Để xác định khả năng hiển thị với MingGW bạn phải đi theo con đường Windows và chú thích các lớp học và chức năng của bạn với:

  • __declspec(dllexport) khi biên dịch thư viện
  • __declspec(dllimport) trong khi liên kết

Nếu bạn muốn hỗ trợ đa nền tảng cho GCC toolchain bạn có thể thêm một tiêu đề trong dự án của bạn làm điều đó cho bạn. Để biết ví dụ từng bước và nhiều chi tiết have a look at GCC's visibility guide.

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