web-dev-qa-db-ja.com

一貫性のないDLLリンケージについて

このリンク警告を削除するにはどうすればよいですか?この警告の原因となるコードセグメントを確認できます。

static AFX_EXTENSION_MODULE GuiCtrlsDLL = { NULL, NULL };
//bla bla
// Exported DLL initialization is run in context of running application
    extern "C" void WINAPI InitGuiCtrlsDLL()
    {
     // create a new CDynLinkLibrary for this app
      new CDynLinkLibrary(GuiCtrlsDLL);
     // nothing more to do
    }

警告C4273: 'InitGuiCtrlsDLL':dllリンケージの不整合

また、次のような定義をエクスポートおよびインポートします。

#ifdef _GUICTRLS
   #define GUI_CTRLS_EXPORT __declspec(dllexport)
#else
   #define GUI_CTRLS_EXPORT  __declspec(dllimport)
#endif
40
baris.aydinoz

複数の可能性があります:

1)static AFX_EXTENSION_MODULE GuiCtrlsDLL = { NULL, NULL };

AFX_EXTENSION_MODULEを使用します。これは、MFC拡張DLLを実装していることを意味します。このような拡張DLLの場合、プリプロセッサ_AFXEXTを定義する必要があります。 Visual C++プロジェクトのC++コンパイラ設定でこれを設定します

見る:

MFC拡張DLLで_declspec(dllexport)を使用する方法: http://support.Microsoft.com/kb/128199

(現在、評判が10未満であるため、複数のリンクを投稿することはできません。後で2つの重要なリンクを追加します。これが解決策である場合、プロセスを高速化する回答としてマークしてください;))

約束どおり、ここに2つのリンクがあります。

AFX_EXTENSION_MODULE構造: http://msdn.Microsoft.com/en-us/library/sxfyk0zk.aspx

TN033:DLL MFCのバージョン: http://msdn.Microsoft.com/en-us/library/hw85e4bb.aspx

2)定義/宣言が重複している可能性があります。

21
Gökhan Akca

プリプロセッサステートメントの目的:

#ifdef _GUICTRLS 
   #define GUI_CTRLS_EXPORT __declspec(dllexport) 
#else 
   #define GUI_CTRLS_EXPORT  __declspec(dllimport) 
#endif 

ヘッダーファイルは、定義されている.dllでクラスまたは関数を__declspec(dllexport)として宣言し、使用する可能性のある他の.dllについては__declspec(dllimport)として宣言することです。

これが機能するためには、エクスポートする.dllのコンパイル時に_GUICTRLSを定義する必要があり、他の.dllには定義しないでください。通常、プロジェクトプロパティの[C/C++]-> [プリプロセッサ]-> [プリプロセッサ定義]で、_GUICTRLSが定義されていることを期待します。

表示されるコンパイラエラーは、通常、_GUICTRLSがエクスポートを行うプロジェクトに対して定義されていないか、通常は1つのプロジェクトから別のプロジェクトへの貼り付けの結果として複数のプロジェクトに対して定義されているために発生します。これは、_GUICTRLSが複数のプロジェクトに含まれるヘッダーファイルで定義されている場合にも表示されます。

40
Eric Thompson

この警告は通常、dllimportの使用が異なる関数の重複した定義が原因で発生します。これをしなかったと確信していますか?

2
Matteo Italia

[CMake一貫性のないDLLリンケージ]

__declspec(dllexport)+ __declspec(dllimport)で次の問題+ソリューションが発生しました。

# # #CMakeLists.txt
add_defintions(-DMYLIB=1)
# The above was the solution...
#    (MYLIB is used in the standard ifdef + define MYLIB_EXPORT syntax)
#  Below: seems to get overruled by other directory's headers: 
set_source_files_properties(  file1.h  file2.h  COMPILE_FLAGS "-DMYLIB=1") 

これは、多くのソースが「ソースファイルプロパティの設定」コマンドを使用してより良い粒度を取得するように言っているため、迷惑でしたが、別のディレクトリからインクルードされたときにfile1.hの宣言がどうなるかについてドキュメントが明確ではありません... add_definitions( -DMYLIB=1 )今のところ!

この問題をキャッチするには:Foo.cppファイルで:

#include "export.h"
#if defined(MYLIB)
#if defined(OTHERLIB)
  static_assert(0,"error, check your definitions!");
  // OTHER depends on MY; can't have both of these flags being set!
#endif
#endif
struct  OTHER_EXPORT  foo 
{ 
};
1
peter karasev

警告メッセージを読むことに加えて、それが発生する場所に注意してくださいワークスペースの一部として複数のプロジェクトがある場合.

DLLが正しくコンパイルおよびリンクされていました。ワークスペースはメインアプリケーションとmyエラーもビルドしていました。誤って、アプリケーション自体のビルドファイルリストに新しい(DLL)ソースファイルを含めていたということです

メインプログラムは、インポートするためにDLLヘッダーmynewdll.hが必要ですが、ソースファイルmynewdll.cppは必要ありません。コードは実行時にDLLで取り込まれます。)ヘッダーファイルとコードファイルをペアとしてプロジェクトに含める習慣。これが私が間違っていた場所です。

警告されていて、DLLプロジェクトがエラーなしでリンクされており、それが不平を言ったメインプログラムであることに気付いていたら、私はずっと早くエラーを検出したでしょう!

私のDLLソースコードとプロジェクトはエラーフリーであり、それは欠陥のある実行可能ファイルをビルドしようとした唯一の方法でした。

1
Ivan

エクスポートされたシンボルを別のプロジェクトで定義していないことを確認してください。また、すべての中間ファイルを手動でクリーンアップして再コンパイルします。

0
damian