5

.lib大規模なプロジェクト用に(静的ライブラリ)を構築していて、ライブラリのエンドユーザーに関数を非表示にしたいの.cですが、ライブラリ内のすべてのファイルからこれらの関数を呼び出すことができる必要があります(したがって静的ではありません)。

これは正反対で__declspec(dllexport)あり、私はすでにgccの解決策を見つけました。

を使用したいのですstaticが、静的関数は「現在のファイル」内でのみ使用できるはず.cなので、これは方法ではありません。

言い換えると、一部の関数をfinalにエクスポートしないように(プロジェクト内の他のすべてのファイルで.lib使用できるようにしながら) Microsoft Visual C++2010に指示する方法が必要です。.c

注:ソリューション全体で__declspec(どちらも__attribute__( visibility))使用したことはありません。これはおそらく、静的ライブラリの構築に関連するデフォルト設定にすぎません(トレースできません)。

4

2 に答える 2

4

これは不可能です。あなたが求めているのは__declspec(dllexport)とは何の関係もありません。これは、DLLの外部に表示される識別子を決定する属性です。これは確かにあなたの要件を満たします。

しかし、あなたは静的ライブラリを求めています。これは非常に単純なファイル形式であり、.objファイルのバッグにすぎません。コンパイル後、lib.exeによってアーカイブにまとめます。.lib内の個別にコンパイルされた.cファイル間の依存関係を解決するために何も起こりません。これは、.libがリンクされるまで発生しません。

その時点で、クライアントコードが使用した外部リンケージを持つ識別子とあなたの識別子の間にまったく違いはありません。可能であれば、自分のファイルを非表示にしようとすると、リンカーが1つの.cファイルと別のファイルの外部依存関係を満たす方法を理解できない場合にリンク障害が発生します。

どこにでも近づく唯一の方法は、すべてのコードを単一の変換ユニットに入れ、関数に静的とマークを付けて、外部リンクがないようにすることです。これは非常に醜いですが、他のすべての.cファイルを#includeする単一のファイルで実行できます。確かにそのオプションを却下するので、これを取得するためにDLLソリューションを追求してください。

于 2012-10-26T16:38:55.830 に答える
1

静的ライブラリから内部シンボルを非表示にし、一部のシンボルのみを外部ユーザーにエクスポートすることは可能だと思います。少なくともLinuxプラットフォームでは可能です。

私は以前、同様の要件を持つOSXとLinuxで作業していました。私のアプローチは、次のオプションを使用して「 ld 」コマンドで事前にリンクされたライブラリを作成することです。

-r -x -exported_symbols_list ../exported_symbols.txt -o $ @$^メイクファイル内。


xcrunldに使用されるオプションは次のとおりです

-x

    Delete all local symbols.

-r

    Generate relocatable output--i.e., generate an output file that can in turn serve as input to ld. This is often called partial linking

-exported_symbols_list

    option uses a text file exported_symbols.txt which contains all the interface APIs for the static library that you want to ship out.

Windowsプラットフォームでも同等のアプローチがあるのではないかと思いました。

于 2016-08-15T04:45:49.637 に答える