2011-10-31 33 views
1

奇妙な質問:私はVisual Studioでスタティックライブラリを構築していますが、実行可能なプロジェクトでも使用するユーティリティ関数のリストを含むソースファイルを使用しています。静的ライブラリをインポートしています。その結果、私はこのようなエラーを取得しています:それらは実際の実行可能なプロジェクトでネイティブに存在しているので、私は、util.obj内の関数をエクスポートしないようにVisual Studioのを取得する方法を見つけ出すことができる方法Visual Studioで静的ライブラリの関数をエクスポートできないようにする

4>newfuncs.lib(util.obj) : error LNK2005: _shift_left already defined in util.obj 
4>newfuncs.lib(util.obj) : error LNK2005: _chop already defined in util.obj 
4>newfuncs.lib(util.obj) : error LNK2005: _crc_begin already defined in util.obj 
4>newfuncs.lib(util.obj) : error LNK2005: _crc_update already defined in util.obj 
4>newfuncs.lib(util.obj) : error LNK2005: _crc_result already defined in util.obj 
4>newfuncs.lib(util.obj) : error LNK2005: _strtok_r already defined in util.obj 

誰もが知っています。

+1

静的ライブラリまたはDLLを構築していますか?あなたのタイトルと質問には同意できません。 –

+0

私の間違い:私は静的ライブラリを生成しています。私のランタイムライブラリの設定は、/ MTと/ MTdです。 – Femi

+0

/MTと/ MTdはリンク先のCおよびC++ランタイムライブラリ(静的または動的)です。彼らはあなたが作っているライブラリが静的であるのかダイナミックであるのかとは何の関係もありません。 –

答えて

1

したがって、わかりました:プラグマステートメントを使用すると、関数は静的ライブラリに統合されます。ヘッダに

#pragma comment(lib, "libev.lib") 

をし、それは私のライブラリにlibevをインポート:私の場合は私が入れ。私が実際に実行可能ファイルを書いたとき、私はライブラリとのリンクが必要でした。追加のlibevの依存関係はありません。

1
  • 単純な答えは、util.objの関数を独自のライブラリに引き込み、ライブラリと実行可能ファイルをリンクさせることです。
  • 単一のソースファイルでユーティリティ関数が必要な場合は、.cファイルに移動して静的宣言すると、定義されているファイルの外部にリンケージはありません。
  • シンボルをエクスポートしないようにしたいのであれば、関数には__declspec(selectany)というマークをつけます。これにより、関数の複数の定義が同等で、好きなものを自由に選択できます(実際に同じであることを確認してください)。
+0

Meh。私はもう一つの図書館が生まれるのを避けることを望んでいましたが、あなたが正しいかもしれないと恐れています。機能がエクスポートテーブルに追加されないようにする魔法の旗が欲しいと思っていました。 – Femi

+0

コードをコピーして2つの場所に貼り付けるのは悪い習慣です。定義が同期しなくなるのは、バグを修正することを忘れないようにするためです。そうでない場合、同僚は定義のうちの1つについてのみ知り、その修正だけを修正します。 –

関連する問題