1

クラスをFrom.dll定義するライブラリの次のソースを検討してください。From

ヘッダ:

// From.h
#include <afxwin.h>
#include <afxext.h>

class AFX_EXT_CLASS From
{
    public:
        static const char staticMember[666];
};

実装:

// From.cpp
#include "From.h"

const char From::staticMember[] = "Total Crap";

このライブラリの静的メンバーstaticMemberは、次のToクラスから使用する必要があり、DLL ( To.dll)も生成する必要があります。

ヘッダ:

// To.h
#include <afxwin.h>
#include <afxext.h>

class AFX_EXT_CLASS To
{
    public:
        static const char* retExtStatic();
};

実装:

// To.cpp
#include "To.h"
#include "From.h"

const char* To::retExtStatic()
{
    return From::staticMember;
}

しかし、それがVisual Studio上に直接あるか、それがcmakeで生成されたnmakeであるかに関係なくLNK2001: unresolved external symbol "public: static char const * const From::staticMember" (?staticMember@From@@2QBDB)、リンクするときにこれを取得し続けます:To.dll

Linking CXX shared library To.dll
   Creating library To.lib and object To.exp
To.cpp.obj : error LNK2001: unresolved external symbol "public: static char const * const From::staticMember" (?staticMember@From@@2QBDB)
To.dll : fatal error LNK1120: 1 unresolved externals

最初の DLL はコンパイルされ、問題なくリンクされています。以下は、私の CMakeLists.txt の関連部分です。

add_definitions (-D_AFXDLL -D_AFXEXT -DPSAPI_VERSION=1)
set (CMAKE_MFC_FLAG 2) # Use MFC in a shared DLL

# FROM
file (GLOB FROM ${CMAKE_CURRENT_SOURCE_DIR}/From.cpp)
add_library (From SHARED ${FROM})
target_link_libraries (From)

# TO
file (GLOB TO ${CMAKE_CURRENT_SOURCE_DIR}/To.cpp)
add_library (To SHARED ${TO})
target_link_libraries (To From)

この静的データ メンバーをエクスポートするのに何が間違っていますか?

4

1 に答える 1

0

@Niall と @Igor Tnadetnik が質問のコメントで指摘したように、DLL が別の DLL を必要とする場合、クラスが で宣言されている場合に使用する DLL のヘッダー ファイルをインクルードするのは安全ではありませんAFX_EXT_CLASS。この場合、クライアント コードも DLL であるため、必要に応じてAFX_EXT_CLASS定義される場合__declspec(dllexport)とそうでない__declspec(dllimport)場合があります。

于 2014-08-20T01:45:44.613 に答える