奇异的未解决的外部编译DLL

Bizarre unresolved external compiling DLL

本文关键字:编译 DLL 外部 未解决      更新时间:2023-10-16

我正在尝试按照本网站上的说明进行操作: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的代码以便链接器可以找到它的任何猜测?

P.S。这是一个人为证明问题的例子,而不是实际的生产代码。

编译器将wideCharBuffer的声明视为函数声明(最烦人的解析)。尝试将其更改为:

Test::TestBuffer<wchar_t> wideCharBuffer((size_t(dwRequiredSize)));