我正在创建一个DLL,并使用FastString
函数提供了CreateFastString
类的入口点: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 -> Input -> Additional Dependencies
中,我提供了.lib
文件的路径。任何人都可以建议出什么问题了。提前致谢。
最佳答案
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;
}
注意:用
FastString.cpp
定义生成MY_DLL_EXPORTS
,以便从结果DLL中导出所有标有MY_DLL_PUBLIC
的符号。 “已导出”,表示它们对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具有一些私有函数或类,这些私有函数或类对于DLL使用者而言不可见,那么最好使用
MY_DLL_PRIVATE
标记它们。最后,在您发布的代码中没有看到任何include guards,并且在示例中也省略了它们,但是请注意,您应该确定要使用它们,因此,如果有的话,也不要忘记将它们添加到所有标头中它们在您的真实代码中丢失。