mingw -fvisibility = скрытый, похоже, не работает - PullRequest
5 голосов
/ 03 ноября 2011

У меня есть общая библиотека, которая должна экспортировать только одну функцию, помеченную __attribute__ ((visibility ("default"))). Он также связывается с другой статической библиотекой (fftw) и

#include<fftw3.h>

предшествует:

#pragma GCC visibility push(hidden)

Используемая команда компоновщика:

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

Теперь полученная библиотека огромна, и если я проверю экспортированные функции, она включает ВСЕ функции fftw и ВСЕ функции из моих файлов. Похоже, Mingw игнорирует параметры видимости. Я читал, что раньше он давал предупреждение о -fvisibility, но теперь он компилируется без предупреждений.

Поддерживают ли mingw и gcc 4.6.1 флаги видимости? Если да, как мне избавиться от всех ненужных вещей в моей общей библиотеке?

Ответы [ 2 ]

4 голосов
/ 30 марта 2012

Mingw - это порт Windows для GCC toolchain, но Windows dll не является Linux so.Особенно ссылка часть отличается .Чтобы указать видимость с MingGW, вы должны пойти по пути Windows и аннотировать ваши классы и функции с помощью:

  • __declspec(dllexport) при компиляции библиотеки
  • __declspec(dllimport) при компоновке

Если вам нужна многоплатформенная поддержка цепочки инструментов GCC, вы можете добавить в свой проект заголовок, который сделает это за вас.Для пошагового примера и множества деталей взгляните на руководство по видимости GCC .

2 голосов
/ 03 ноября 2011

Объектные файлы Windows PE не имеют атрибутов видимости.Наиболее близким является dllexport / dllimport, но это только для разделяемых библиотек (DLL).Так что либо вы не помечаете все функции FFTW __declspec(dllexport), и надеетесь, что связывание статической библиотеки сделает The Right Thing (tm), либо вы позаботитесь о том, чтобы не связываться с FFTW при связывании с вашей библиотекой.

Это должно предупредитьо плохих атрибутах видимости, возможно, вам нужно увеличить уровень предупреждения -Wall -Wextra -pedantic).

...