提问人:Murrgon 提问时间:10/31/2012 最后编辑:Adrian McCarthyMurrgon 更新时间:10/31/2012 访问量:126
奇怪的未解析的外部编译DLL
Bizarre unresolved external compiling DLL
问:
我正在尝试按照本网站上的说明进行操作:http://support.microsoft.com/kb/q168958
代码如下:
#include <windows.h>
#include <malloc.h>
namespace Test {
template<class TYPE> class TestBuffer
{
private:
TYPE* m_pData;
size_t m_uSize;
public:
TestBuffer(size_t uSize) : m_pData(NULL), m_uSize(0)
{
m_pData = (TYPE*)malloc(uSize * sizeof(TYPE));
}
~TestBuffer() { if (NULL != m_pData) free(m_pData); }
public:
bool IsValid() const { return NULL != m_pData; }
operator TYPE*() const { return m_pData; }
};
template class __declspec(dllexport) Test::TestBuffer<wchar_t>;
__declspec(dllexport) bool GetCurrentDir(char* szDir, size_t uSize)
{
DWORD dwRequiredSize = ::GetCurrentDirectoryW(0, NULL);
Test::TestBuffer<wchar_t> wideCharBuffer(size_t(dwRequiredSize));
bool bResult = (dwRequiredSize - 1 ==
::GetCurrentDirectoryW(dwRequiredSize, (wchar_t*)wideCharBuffer));
wcstombs(szDir, (wchar_t*)wideCharBuffer, uSize);
return bResult;
}
} // namespace Test
BOOL WINAPI DllMain(HMODULE hModule, DWORD dwReason, LPVOID lpReserved)
{
char szPath[MAX_PATH] = { 0 };
Test::GetCurrentDir(szPath, MAX_PATH);
return TRUE;
}
将其放在 VS 的 WIN32 DLL 项目中会弹出以下错误:
error LNK2019: unresolved external symbol "class Test::TestBuffer<wchar_t> __cdecl wideCharBuffer(unsigned int)" (?wideCharBuffer@@YA?AV?$TestBuffer@_W@Test@@I@Z) referenced in function "bool __cdecl Test::GetCurrentDir(char *,unsigned int)"
我不确定为什么链接器找不到定义,因为所有内容都在那里定义,以及 TestBuffer 的导出语句。此外,在此示例中,我甚至不需要导出 TestBuffer 的显式实例化,因为它没有在 DLL 接口中公开,只有 GetCurrentDir() 公开。
关于为什么不为 TestBuffer 生成代码以便链接器可以找到它的任何猜测?
附言 这是一个人为的示例来演示问题,而不是实际的生产代码。
答:
5赞
Synxis
10/31/2012
#1
编译器将 的声明视为函数声明(最令人烦恼的解析)。尝试将其更改为:wideCharBuffer
Test::TestBuffer<wchar_t> wideCharBuffer((size_t(dwRequiredSize)));
评论
0赞
David Heffernan
10/31/2012
先生,打得好!很容易看出,当删除模板代码时会出现问题。
0赞
Murrgon
10/31/2012
@Synxis很奇怪。将其更改为 C 型演员也可以。这确实是一个最令人烦恼的解析。谢谢。
评论
wideCharBuffer
Test::TestBuffer<wchar_t>
GetCurrentDir