46

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

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
4

7 に答える 7

54

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

#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には定義しないでください。通常、_GUICTRLSは、プロジェクトのプロパティの[C /C++]->[プリプロセッサ]->[プリプロセッサ定義]で定義されていると予想されます。

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

于 2010-05-12T20:33:36.733 に答える
27

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

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

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

見る:

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

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

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

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

于 2011-01-14T14:32:10.493 に答える
4

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

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

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

アラートがあり、DLLプロジェクトがエラーなしでリンクされていて、それがメインプログラムであることに気付いた場合、エラーをはるかに早く検出できたはずです。

私のDLLソースコードとプロジェクトにはエラーがなく、実行可能ファイルをビルドしようとした方法だけが問題でした。

于 2015-05-11T10:11:28.630 に答える
2

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

于 2010-04-07T13:50:15.670 に答える
2

[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") 

多くのソースが「setsourcefileproperties」コマンドを使用して粒度を向上させると言っているので、これは厄介でしたが、ドキュメントは、別のディレクトリからインクルードされたときに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 
{ 
};
于 2014-09-03T07:35:21.050 に答える
0

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

于 2013-03-16T08:29:50.233 に答える
0

私の場合、エラーC4273は、msvc2017_64ツールチェーンによってQt5のDLLダイナミックロードテスターアプリから.libファイルにリンクしようとしたことが原因で発生しました。.proファイルのLIBS設定を変更して.libファイルへの参照を削除すると、問題が解決します。

于 2020-01-24T15:46:17.650 に答える