2011-11-03 8 views
5

__attribute__ ((visibility ("default")))とマークされている関数を1つだけエクスポートする共有ライブラリがあります。それはまた別の静的ライブラリ(FFTW)とリンクし、mingw -fvisibility = hiddenは動作していないようです

#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は可視性フラグをサポートしていますか?はいの場合、共有ライブラリのすべての不要なものを取り除くにはどうしたらいいですか?

答えて

1

Windows PEオブジェクトファイルには可視属性がありません。一番近いのはdllexport/dllimportですが、これは共有ライブラリ(DLL)の場合のみです。したがって、すべてのFFTW関数を__declspec(dllexport)とマークしたり、スタティックライブラリをリンクすることがThe Right Thing (tm)であるかどうか、ライブラリとリンクしている場合はFFTWにリンクしないように注意してください。

悪意のある属性について警告する必要があります。おそらく警告レベル-Wall -Wextra -pedanticを有効にする必要があります。

4

MingwはGCCツールチェーンのWindowsポートですが、Windows dllはLinux以外のsoです。特にthe link part is different。あなたがのためのマルチプラットフォームのサポートが必要な場合

をリンクしながら、ライブラリー

  • __declspec(dllimport)をコンパイル中

    • __declspec(dllexport):あなたがして、Windowsの道を行くと、あなたのクラスや関数に注釈を付ける必要がありMingGWと可視性を指定するにはGCCツールチェーンを使用すると、プロジェクトでヘッダを追加することができます。ステップバイステップの例とたくさんの詳細についてhave a look at GCC's visibility guide

  • 関連する問題