2011-08-08 84 views
11

リンクステップで警告があります。これらの警告は、リリースモードでのみ表示されます。警告を削除する方法LNK4217およびLNK4049

私のプログラムは、.libを生成するライブラリと、このライブラリを使用する実行可能ファイルの2つの部分で構成されています。

ライブラリをビルドするときに警告が表示されません。しかし、私が実行ファイルをビルドすると、リンク上に警告LNK4217とLNK4049があります。例えば:私はMSDNに読んだ

3>DaemonCommon.lib(Exception.obj) : warning LNK4217: locally defined symbol [email protected]@@[email protected]@Z (public: __thiscall std::exception::exception(char const * const &)) imported in function "public: __thiscall std::bad_alloc::bad_alloc(char const *)" ([email protected]@@[email protected]@Z) 
3>DaemonCommon.lib(CommAnetoException.obj) : warning LNK4217: locally defined symbol [email protected]@@[email protected]@Z (public: __thiscall std::exception::exception(char const * const &)) imported in function "public: __thiscall std::bad_alloc::bad_alloc(char const *)" ([email protected]@@[email protected]@Z) 

、これらの警告は、__declspec(DLLIMPORT)の宣言によって引き起こされ得ます。しかし、私のクラスの私のクラスでは、私はこのような宣言はしていません。たとえば、ここに私のクラスの例外がある:これらの警告が表示され、それらを削除する方法をなぜ

#ifndef _EXCEPTION_HPP__ 
#define _EXCEPTION_HPP__ 

#include <string> 

namespace Exception 
{ 
    class Exception 
    { 
    public: 
     // Constructor by default 
     Exception(); 

     // Constructor parametrized 
     Exception(std::string& strMessage); 

     // Get the message of the exception 
     virtual std::string getMessage() const; 

     // Destructor 
     virtual ~Exception(); 

    protected: 

     // String containing the message of the exception 
     std::string mStrMessage; 
    }; 
} 

#endif 

誰かが私に言うことはできますか?

答えて

17

__declspec(import)は、「インポート済み」の記号に「」と記載されています。 public: __thiscall std::exception::exception(char const * const &)にあります。これは、実行時選択(/MT(静的マルチスレッド実行時)vs /MD(動的ランタイム))とプリプロセッサオプション(_DLLが定義)のコンパイラオプションの不一致によって発生する可能性があります。特に、これらの警告は、/MT(またはデバッグ設定の場合は/MTd)でコンパイルすると表示されますが、何らかの形で_DLLが定義されています。

/MDでコンパイルしない場合は、_DLLを定義していないことを確認してください。

実行可能ファイルと同じランタイムのすべてのライブラリをコンパイルするので、実行時の選択はすべてのプロジェクトのために一致し、あなたが任意のサードパーティのライブラリの適切なバージョンをリンクしていることをことを確認することも重要です。

+2

実際には、これは私の実行可能なプロジェクトではなく、「マルチスレッド・\ MT」の「マルチスレッドDLL \ MD」に定義されたので...私は理由を知りませんでした。 ..ありがとう;-) – Cedekasme

0

これはOPの問題に関連していないが、何のランタイムライブラリの不一致が存在しない実行ファイル、ローカルライブラリにリンクするとき、私はまたLNK4217を見てきました。 (関係なく、静的または動的なランタイムが使用されているかどうかの)静的としてそれらを構築する際に

いくつかのライブラリは、プリプロセッサの定義が必要です。たとえば、libzmq(0MQ)では、静的ライブラリを構築するときにシンボルZMQ_STATICを定義する必要があります。それ以外の場合は、ライブラリを実行可能ファイルにリンクするときにLN2417が表示されます。

1

__declspecのミスマッチ(DLLEXPORT)/ __ declspec(DLLIMPORT)も機能/クラス定義をヘッダに起因し発生する可能性があり、 ヘッダー定義/ "唯一の"関数/クラスとリンクされた関数/クラスが混在した共有ライブラリ(.dll)を構築しています(コンパイル時に__declspec共有ライブラリと__declspec(dllimport)を使用している間)。 実際にヘッダーのみであるため、コンパイル済みのlib自体の一部ではない部分については、__declspec(dllexport)/ __ declspec(dllimport)を定義するのが一般的なエラーです。何declspec(dllimportの)上のラスKeldorphから

0

一部info実際に行います。 (/QSimplicit-import-スイッチを使用することを提案している。)

関連する問題