【问题标题】:error LNK2019: unresolved external symbol _CreateFastString referenced in function _wmain错误 LNK2019:函数 _wmain 中引用的未解析的外部符号 _CreateFastString
【发布时间】:2013-05-13 17:13:59
【问题描述】:

我正在创建一个 DLL 并使用CreateFastString 函数提供FastString 类的入口点:

FastString.h:

#define EXPORT __declspec(dllexport)
#define IMPORT __declspec(dllimport)

class FastString
{
    const int m_length;
    char* m_str;

public:
    FastString(const char* str);
    ~FastString();
    int Length()const;
    int Find(const char* str)const;
};

extern "C" FastString* CreateFastString(const char* str);

FastString.cpp:

#include "stdafx.h"
#include <string>
#include "FastString.h"

FastString* CreateFastString(const char* str)
{
    return new FastString(str);
}

FastString::FastString(const char* str): m_length(strlen(str)),
                                         m_str(new char[m_length+1])
{}

FastString::~FastString()
{
    delete[] m_str;
}

int FastString::Length()const
{
    return m_length;
}

int FastString::Find(const char* str)const
{
    return 1;
}

main.cpp:

#include "stdafx.h"
#include <iostream>
#include "FastString.h"

int _tmain(int argc, _TCHAR* argv[])
{
    FastString* str = CreateFastString("Hello Dll");
    std::cout<<"The length is "<<str->Length()<<std::endl;
    return 0;
}

在编译过程中,我收到以下错误:

TeatApp.obj : error LNK2019: unresolved external symbol _CreateFastString referenced in function _wmain
D:\MFC\FastString\Debug\TeatApp.exe : fatal error LNK1120: 1 unresolved externals

Linker -&gt; Input -&gt; Additional Dependencies 中,我提供了.lib 文件的路径。

任何人都可以提出问题所在。提前致谢。

【问题讨论】:

  • 您忘记正确使用EXPORTIMPORT
  • @haroogan 即使我声明类 EXPORT FastString 它仍然没有帮助。
  • 我正在为您准备答案,请稍等。

标签: c++ visual-c++ dll linker shared-libraries


【解决方案1】:

config.h:

#define MY_DLL_EXPORT __declspec(dllexport)
#define MY_DLL_IMPORT __declspec(dllimport)

// Should be defined when MyDLL is built (more details below).
#ifdef MY_DLL_EXPORTS
  #define MY_DLL_PUBLIC MY_DLL_EXPORT
#else
  #define MY_DLL_PUBLIC MY_DLL_IMPORT
#endif

#define MY_DLL_PRIVATE

#ifdef __cplusplus
  #define MY_DLL_FUNCTION extern "C"
#else
  #define MY_DLL_FUNCTION extern
#endif

FastString.h:

#include "config.h"

class MY_DLL_PUBLIC FastString
{
    const int m_length;
    char* m_str;

public:
    FastString(const char* str);
    ~FastString();
    int Length() const;
    int Find(const char* str) const;
};

MY_DLL_FUNCTION FastString* MY_DLL_PUBLIC CreateFastString(const char* str);

FastString.cpp:

#include "FastString.h"

#include "stdafx.h"

#include <string>

FastString* CreateFastString(const char* str)
{
    return new FastString(str);
}

FastString::FastString(const char* str): m_length(strlen(str)),
                                         m_str(new char[m_length+1])
{}

FastString::~FastString()
{
    delete[] m_str;
}

int FastString::Length()const
{
    return m_length;
}

int FastString::Find(const char* str)const
{
    return 1;
}

注意:MY_DLL_EXPORTS定义构建FastString.cpp,这样所有标有MY_DLL_PUBLIC的符号都导出生成的 DLL。 “已导出”,表示它们将对 DLL 使用者(例如您的应用程序)可见。最佳实践是在编译期间提供此定义。例如,在 MSVC 上,可以通过在编译器调用中添加 /DMY_DLL_EXPORTS 来完成。

main.cpp:

#include "stdafx.h"

#include "FastString.h"

#include <iostream>

int _tmain(int argc, _TCHAR* argv[])
{
    FastString* str = CreateFastString("Hello Dll");
    std::cout<<"The length is "<<str->Length()<<std::endl;
    return 0;
}

注意:main.cpp 是您的应用程序,它基本上是 DLL 使用者,因此,您应该在其编译期间定义 MY_DLL_EXPORTS,以便所有标有MY_DLL_PUBLIC 的符号是从使用的 DLL 导入的。

如果您的 DLL 有一些 private 函数或类应该对 DLL 使用者可见,那么最好用MY_DLL_PRIVATE 标记它们。最后,我在您发布的代码中没有看到任何 include guards,我在示例中也省略了它们,但请注意,您应该肯定拥有它们,所以不要忘记添加它们如果您的真实代码中缺少它们,那么您的所有标题也是如此。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多